我不允许在宏中使用哪些无效字符?
#define TE$T 8
似乎有效,因此$
有效
有人有无效字符列表吗? (或相反的有效列表)。
答案 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”和“_”,并且第一个字符不应为数字。一些预处理器也允许美元符号字符'$',但你不应该使用它。
答案 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。
话虽如此,仍然遵守以下规则:
宏名称不得以数字开头,如果您违反此规定,可能会收到如下错误:
error: macro names must be identifiers
宏名称不得包含空格。例如#define FULL NAME "Your name"
为您提供:
error: ‘NAME’ undeclared (first use in this function)