문제

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, 밑줄 및 구현 된 문자를 포함하십시오.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top