宏名称的有效字符是什么?

时间:2008-12-15 19:49:19

标签: c compiler-warnings c-preprocessor

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”?

4 个答案:

答案 0 :(得分:32)

宏名称应仅由字母数字字符和下划线组成,即'a-z''A-Z''0-9''_',并且第一个字符不应为数字。一些预处理器也允许美元符号字符'$',但你不应该使用它;不幸的是我不能引用C标准,因为我没有它的副本。

来自GCC documentation

  

预处理令牌分为五个   广义类:标识符,   预处理数字,字符串   文字,标点符号等。一个   标识符与a相同   C中的标识符:任何序列   字母,数字或下划线,其中   以字母或下划线开头。   C的关键词没有意义   预处理器;他们很普通   身份标识。您可以定义一个宏   例如,其名称是关键字。   唯一可以识别的标识符   被认为是预处理关键字   defined。见定义。

     

其他语言的情况大多如此   它使用C预处理器。然而,   一些C ++的关键词是   即使在预处理器中也很重要。   请参阅C ++命名运算符。

     

在1999 C标准中,标识符   可能包含不属于的部分的字母   “基本来源字符集”,   由执行人员自行决定   (例如重音拉丁字母,希腊语   字母或中文表意文字)。这个   可以用扩展字符完成   设置,或'\u''\U'转义   序列。这个的实现   GCC的特征是实验性的;这样   字符只接受在   只有'\u''\U'形成   使用-fextended-identifiers

     

作为扩展,GCC将'$'视为一个   信件。这是为了兼容   某些系统,例如VMS,其中'$'   通常用于系统定义   功能和对象名称。 '$'不是   严格符合要求的信件,   或者如果您指定-$选项。看到   调用

答案 1 :(得分:9)

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.

谁知道。我很乐意......但到目前为止,谷歌已经让我失望了。任何有关该主题的见解,都将受到赞赏。️。

答案 2 :(得分:8)

你是对的,就名称而言,相同的规则适用于宏和标识符:有效字符是[A-Za-z0-9_]。

通常使用CAPITALIZED名称来区分宏与其他标识符 - 变量和函数名称。

答案 3 :(得分:1)

指定变量名称的有效标识符的相同规则适用于宏名称,但宏可能与关键字具有相同的名称。标识符名称中的有效字符包括digitsnon-digits,不得以数字开头。 non-digits包括大写字母A-Z,小写字母a-z,下划线和任何实现定义的字符。