매크로 이름의 유효한 문자는 무엇입니까?
-
21-08-2019 - |
문제
C 스타일 매크로 이름은 식별자와 동일한 명명 규칙에 따라 다릅니 까? 컴파일러 업그레이드 후, 이제 레거시 응용 프로그램에 대한이 경고를 방출하고 있습니다.
warning #3649-D: white space is required between the macro name "CHAR_" and its replacement text
#define CHAR_& 38
이 코드 라인은 암페어에 대한 ASCII 값 상수를 정의합니다.
#define DOL_SN 36
#define PERCENT 37
#define CHAR_& 38
#define RT_SING 39
#define LF_PAR 40
나는이 정의 (내가 알 수있는 한 실제로 어떤 코드에 의해 참조되지 않음) 버그가 많고 "char_ampersand"와 같은 것으로 변경해야한다고 가정합니다.
해결책
매크로 이름은 영숫자와 밑줄로만 구성되어야합니다. 'a-z'
, 'A-Z'
, '0-9'
, 그리고 '_'
, 그리고 첫 번째 문자는 숫자가되어서는 안됩니다. 일부 사전 처리기는 또한 달러 사인 캐릭터를 허용합니다 '$'
, 그러나 당신은 그것을 사용해서는 안됩니다. 불행히도 사본이 없기 때문에 C 표준을 인용 할 수 없습니다.
로부터 GCC 문서:
전처리 토큰은 식별자, 전처리 번호, 문자열 리터럴, 구두점 및 기타 5 가지 광범위한 클래스로 분류됩니다. an 식별자 C : 문자 나 밑줄로 시작하는 일련의 문자, 자리 또는 밑줄 시퀀스의 식별자와 동일합니다. C의 키워드는 사전 처리기에게 의미가 없습니다. 그들은 일반 식별자입니다. 예를 들어 이름이 키워드 인 매크로를 정의 할 수 있습니다. 전처리 키워드로 간주 될 수있는 유일한 식별자는 다음과 같습니다.
defined
. 정의 된 참조.이것은 대부분 C 프리 프로세서를 사용하는 다른 언어에 해당됩니다. 그러나 C ++의 키워드 중 일부는 사전 처리기에서도 중요합니다. C ++ 명명 된 연산자를 참조하십시오.
1999 년 C 표준에서 식별자는 구현의 재량에 따라 "기본 소스 문자 세트"의 일부가 아닌 문자를 포함 할 수 있습니다 (예 : 악센트 라틴 문자, 그리스 문자 또는 중국 표상). 이것은 확장 문자 세트 또는
'\u'
그리고'\U'
탈출 시퀀스. GCC 에서이 기능의 구현은 실험적입니다. 그러한 문자는'\u'
그리고'\U'
형태와 경우에만-fextended-identifiers
사용.확장으로 GCC는 대접합니다
'$'
편지로. 이것은 VMS와 같은 일부 시스템과의 호환성을위한 것입니다.'$'
일반적으로 시스템 정의 기능 및 객체 이름에서 사용됩니다.'$'
엄격하게 준수하는 모드의 문자가 아니거나-$
옵션. 호출을 참조하십시오.
다른 팁
clang
많은 "미친"캐릭터를 허용합니다 .. 나는 찾기 위해 고군분투했지만 어느 많은 운율이나 이유 - 왜 약간 허용되고 다른 사람들은 가능합니다 ~ 아니다. 예를 들어..
#define 💩 ?: /// WORKS FINE
#define ■ @end /// WORKS FINE
#define 🅺 @interface /// WORKS FINE
#define P @protocol /// WORKS FINE
아직
#define ☎ TEL /// ERROR: Macro name must be an identifier.
#define ❌ NO /// ERROR: Macro name must be an identifier.
#define ⇧ UP /// ERROR: Macro name must be an identifier.
#define 〓 == /// ERROR: Macro name must be an identifier.
#define 🍎 APPLE /// ERROR: Macro name must be an identifier.
누가 알아. 나는 ...하지만 Google은 지금까지 저를 실패했습니다. 주제에 대한 통찰력은 ™ k에 감사드립니다.
맞습니다. 동일한 규칙이 매크로 및 이름에 관한 한 식별자에게 적용됩니다. 유효한 문자는 [A-ZA-Z0-9_]입니다.
자본화 된 이름을 사용하여 매크로를 다른 식별자 (변수 및 함수 이름과 차별화하는 것이 일반적입니다.
변수 이름에 유효한 식별자를 지정하는 동일한 규칙은 매크로가 키워드와 동일한 이름을 가질 수 있다는 점을 제외하고 매크로 이름에 적용됩니다. 식별자 이름의 유효한 문자에는 포함됩니다 digits
그리고 non-digits
숫자로 시작해서는 안됩니다. non-digits
대문자 AZ, 소문자 AZ, 밑줄 및 구현 된 문자를 포함하십시오.