即使是一个老朋友,我担心我不再(完全)完全掌握在C中解析常量.下面的第二个1行无法编译:
int main( void ) { return (0xe +2); }
int main( void ) { return (0xe+2); }
Run Code Online (Sandbox Code Playgroud)
$ gcc -s weird.c
weird.c: In function ‘main’:
weird.c:1:28: error: invalid suffix "+2" on integer constant
int main( void ) { return (0xe+2); }
^
Run Code Online (Sandbox Code Playgroud)
根据C11标准条款6.4.4.2,编译失败的原因可能是0xe + 2被解析为十六进制浮点常量.我的问题是,是否存在在C中编写十六进制和十进制数的简单加法的约定,我不喜欢在解析时依赖于空格.
这是使用gcc版本5.4.0 20160609(Ubuntu 5.4.0-6ubuntu1~16.04.9).在预处理(-E)之后停止编译显示编译失败发生在gcc而不是cpp中.
似乎可以定义一个宏来连接 3 个标记为:
#define concat3(a,b,c) a##b##c
Run Code Online (Sandbox Code Playgroud)
中间令牌(例如由生成的令牌a##b或b##c必须是有效的预处理器令牌)是否可以concat3(.,.,.)成功粘贴到所有符合要求的实现上?(1)
(1) 许多编译器支持..作为 case 范围的标记,这使其成为有效标记,但是 C 标准没有定义这个标记,那么concat3()宏会在不支持它的架构上失败吗?