【问题标题】:Invalid characters in C preprocessors/macros? [duplicate]C 预处理器/宏中的无效字符? [复制]
【发布时间】:2016-06-01 12:05:45
【问题描述】:

我不允许在中使用哪些不同的无效字符
看来#define TE$T 8 工作正常,所以$ 有效。
有人有无效字符列表吗? (或相反的有效列表)。

【问题讨论】:

  • 宏标识符不能以数字开头。

标签: c c-preprocessor


【解决方案1】:

是您的编译器允许使用$ 作为标识符。它不是标准的,如果您使用-pedantic 或类似名称进行编译,您不应该期望其他编译器提供它或您的编译器允许它。

在 C11 草案的通用扩展附录中:

J.5.2 专用标识符

1 下划线_、字母和数字以外的字符, 不是基本源字符集的一部分(例如美元符号 $,或国家字符集中的字符)可能出现在标识符 (6.4.2) 中。

第 6.4.2 节 显示了每个 符合编译器必须的字符 支持:

6.4.2 Identifiers
6.4.2.1 General
Syntax 1         identifier:
                 identifier-nondigit
                 identifier identifier-nondigit
                 identifier digit
         identifier-nondigit:
                 nondigit
                 universal-character-name
                 other implementation-defined characters
         nondigit: one of
                _ a b            c    d    e    f     g    h    i    j     k    l    m
                    n o          p    q    r    s     t    u    v    w     x    y    z
                    A B          C    D    E    F     G    H    I    J     K    L    M
                    N O          P    Q    R    S     T    U    V    W     X    Y    Z
         digit: one of
                0 1        2     3    4    5    6     7    8    9

你应该限制自己。

【讨论】:

    【解决方案2】:

    宏名称只能由字母数字字符和下划线组成,即“a-z”、“A-Z”、“0-9”和“_”,并且第一个字符不能是数字。一些预处理器也允许美元符号字符'$',但你不应该使用它。

    也看看这个...What are the valid characters for macro names?

    【讨论】:

      【解决方案3】:

      看来#define TE$T 8 有效,所以$ 有效。

      那不是真的。 $ 不是标准 C 中标识符的有效字符。某些编译器,例如 GCC,允许将标识符中的 $ 作为扩展名。 (见Dollar Signs

      所以你问错问题了,宏中的名称没有什么特别之处,预处理器所做的只是文本替换。

      【讨论】:

      • 错了!标准没有要求,但标准很好地允许这样的附加字符,因此对于特定的实现(例如 gcc),它们是非常有效的字符。
      【解决方案4】:

      考虑 somefille.c

      #include<stdio.h>
      #define NAM$ "SomeName"
      int main(void)
      {
      printf("Name - %s\n",NAM$);
      
      return 0;
      }
      

      编译以上内容
      gcc -pedantic somefille.c -o somefille
      

      给你

      somefille.c:2:9: warning: '$' in identifier or number [enabled by default]
       #define NAM$ "SomeName"
      

      这个[ page ] 说。

      -迂腐
      发出严格的 ISO C 和 ISO C++ 要求的所有警告;拒绝所有使用禁止扩展的程序,以及其他一些 不遵循 ISO C 和 ISO C++ 的程序。对于 ISO C,遵循 使用的任何 -std 选项指定的 ISO C 标准的版本。

      按照严格的标准,宏名称中不能有空格,并且必须符合 C 变量遵循的相同命名规则:只能使用字母、数字和下划线 (_) 字符,并且第一个字符不能是数字。

      问题是各种编译器不符合这一点。我上面提到的 gcc 就是一个例子。

      话虽如此,以下规则仍然遵守:

      1. 宏名称不能以数字开头,如果违反此规定,可能会出现如下错误:

        error: macro names must be identifiers
        
      2. 宏名称不能包含空格。例如#define FULL NAME "Your name" 给你:

        error: ‘NAME’ undeclared (first use in this function)
        

      【讨论】:

      • 错了!它不是标准所要求的,但是标准很好地允许这样的附加字符,因此对于特定的实现(例如 gcc),它们是非常有效的字符(不是特定于宏名称,顺便说一句。)。
      • @Olaf :我确实提到了“严格的 ISO C”,它不允许除标准功能之外的任何东西恕我直言。
      • 请仔细阅读引用的段落。该标准明确允许附加字符。尽管扩展经常违反标准。
      猜你喜欢
      • 2017-09-18
      • 2012-07-21
      • 2011-11-28
      • 2020-02-09
      • 2019-06-21
      • 1970-01-01
      • 2011-03-26
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多