【发布时间】:2016-06-01 12:05:45
【问题描述】:
我不允许在宏中使用哪些不同的无效字符?
看来#define TE$T 8 工作正常,所以$ 有效。
有人有无效字符列表吗? (或相反的有效列表)。
【问题讨论】:
-
宏标识符不能以数字开头。
标签: c c-preprocessor
我不允许在宏中使用哪些不同的无效字符?
看来#define TE$T 8 工作正常,所以$ 有效。
有人有无效字符列表吗? (或相反的有效列表)。
【问题讨论】:
标签: c c-preprocessor
是您的编译器允许使用$ 作为标识符。它不是标准的,如果您使用-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
你应该限制自己。
【讨论】:
宏名称只能由字母数字字符和下划线组成,即“a-z”、“A-Z”、“0-9”和“_”,并且第一个字符不能是数字。一些预处理器也允许美元符号字符'$',但你不应该使用它。
【讨论】:
看来
#define TE$T 8有效,所以$有效。
那不是真的。 $ 不是标准 C 中标识符的有效字符。某些编译器,例如 GCC,允许将标识符中的 $ 作为扩展名。 (见Dollar Signs)
所以你问错问题了,宏中的名称没有什么特别之处,预处理器所做的只是文本替换。
【讨论】:
考虑 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 就是一个例子。
话虽如此,以下规则仍然遵守:
宏名称不能以数字开头,如果违反此规定,可能会出现如下错误:
error: macro names must be identifiers
宏名称不能包含空格。例如#define FULL NAME "Your name" 给你:
error: ‘NAME’ undeclared (first use in this function)
【讨论】: