相关疑难解决方法(0)

写简单添加十六进制和十进制数的约定

即使是一个老朋友,我担心我不再(完全)完全掌握在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中.

c parsing gcc c99

23
推荐指数
2
解决办法
1323
查看次数

我们可以使用 C 预处理器 ## 运算符粘贴 3 个标记吗?

似乎可以定义一个宏来连接 3 个标记为:

#define concat3(a,b,c) a##b##c
Run Code Online (Sandbox Code Playgroud)

中间令牌(例如由生成的令牌a##bb##c必须是有效的预处理器令牌)是否可以concat3(.,.,.)成功粘贴到所有符合要求的实现上?(1)


(1) 许多编译器支持..作为 case 范围的标记,这使其成为有效标记,但是 C 标准没有定义这个标记,那么concat3()宏会在不支持它的架构上失败吗?

c concatenation language-lawyer c-preprocessor

5
推荐指数
1
解决办法
80
查看次数

标签 统计

c ×2

c-preprocessor ×1

c99 ×1

concatenation ×1

gcc ×1

language-lawyer ×1

parsing ×1