代码之家  ›  专栏  ›  技术社区  ›  An̲̳̳drew Chad Okere

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

  •  51
  • An̲̳̳drew Chad Okere  · 技术社区  · 17 年前

    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 回复  |  直到 17 年前
        1
  •  43
  •   Adam Rosenfield    17 年前

    宏名称应仅由字母数字字符和下划线组成,即。 '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,其中 '$' 通常用于系统定义 函数和对象名称。 '$' 不是 严格符合模式的信件, 或者,如果您指定 -$ 选项。看见 调用。

        2
  •  16
  •   Alex Gray    10 年前

    clang 允许有很多“疯狂”的角色。尽管我一直在努力寻找 任何 有很多韵律或理由 为什么? 一些 是允许的,其他人是 例如。。

    #define 💩  ?:          /// WORKS FINE
    #define  ï¿­  @end        /// WORKS FINE
    #define 🅺  @interface  /// WORKS FINE
    #define ï¼°  @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.
    

    谁知道呢。 我很想……但到目前为止,谷歌让我失望了。如果您对这个问题有任何见解,我们将不胜感激。

        3
  •  8
  •   philant    17 年前

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

    通常使用大写名称来区分宏与其他标识符(变量和函数名)。

        4
  •  1
  •   Robert Gamble    17 年前

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