#define foo 123
foo
_foo
->foo
&foo
在上面的文件上运行gcc -E
会输出以下内容:
123
_foo
->123
&123
这表明_
不是记号分隔符,而_foo
是一个完整的单词.
在哪里可以找到C预处理器的有效令牌分隔符的列表?
#define foo 123
foo
_foo
->foo
&foo
在上面的文件上运行gcc -E
会输出以下内容:
123
_foo
->123
&123
这表明_
不是记号分隔符,而_foo
是一个完整的单词.
在哪里可以找到C预处理器的有效令牌分隔符的列表?
我可能会被语言律师烤熟.但我是这么读这份说明书的.
关于ANidentifier token,这是预处理器关心的WRT到#define
替换以及编译器本身的问题.它不包括字符串文字.标识符令牌是以字母(a-z
、A-Z
)或下划线(_
)开头的任意序列,后跟任意数量的字母、数字或下划线.换句话说,下划线标识令牌的方式与任何其他字母或数字相同.
或者稍微正式一点(但不完美),标识符令牌是这个正则表达式:
[a-zA-Z_]([a-zA-Z0-9_])*
个
换句话说,下划线只是另一个字母.
与上面的正则表达式不匹配的任何其他标记都是另一种类型的标记(字符串、空格、运算符、圆括号等).
把这一切带回家.
这些表达式如下:
foo
_foo
->foo
&foo
"foo"
foo456
5foo
解析为:
identifier (foo)
identifier (_foo)
operator (->) followed by identifier (foo)
operator (&) followed by identifier (foo)
string literal ("foo")
identifier (foo456)
invalid identifier: (5foo).
执行#define foo 123
替换的预处理器将匹配名为foo
的标识符.它不会将foo456
扩展到123456,也不会将_foo
扩展到_123
,因为它们是完全不同的标识符名.
我对5foo
不是5foo
%肯定,但无论如何我看不出它被认为是有效的标识符令牌.或者更准确地说,它是一个无效的数字令牌.
来源:C++草案标准(https://isocpp.org/files/papers/N4860.pdf)第5.4节是的,我知道这个问题被标记为C,但它应该足够匹配.