C预处理器/宏中的字符无效?

时间:2016-06-01 12:05:45

标签: c c-preprocessor

我不允许在中使用哪些无效字符#define TE$T 8似乎有效,因此$有效 有人有无效字符列表吗? (或相反的有效列表)。

4 个答案:

答案 0 :(得分:2)

您的编译器允许使用$作为标识符。它不是标准的,你不应该期望其他编译器提供它或你的编译器允许它,如果你使用-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

你应该限制自己。

答案 1 :(得分:1)

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

另外看看...... What are the valid characters for macro names?

答案 2 :(得分:1)

  

似乎#define TE$T 8正在运作,因此$有效。

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

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

答案 3 :(得分:0)

考虑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 ]说。

  

-pedantic
      发出严格的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)