【发布时间】:2018-09-20 21:51:25
【问题描述】:
尽管是老前辈,但我担心我(不再)完全掌握 C 中常量的解析。以下 1-liners 中的第二个无法编译:
int main( void ) { return (0xe +2); }
int main( void ) { return (0xe+2); }
$ gcc -s 奇怪的.c
weird.c: In function ‘main’:
weird.c:1:28: error: invalid suffix "+2" on integer constant
int main( void ) { return (0xe+2); }
^
编译失败的原因可能是 0xe+2 按照 C11 标准条款 6.4.4.2 被解析为十六进制浮点常量。我的问题是是否存在约定来用C编写简单的十六进制和十进制数的加法,我不喜欢在解析中依赖空格。
这是 gcc 版本 5.4.0 20160609 (Ubuntu 5.4.0-6ubuntu1~16.04.9)。预处理后停止编译(-E)表明编译失败发生在gcc而不是cpp。
【问题讨论】:
-
只是猜测,所以不能作为答案:您可能必须远离任何看起来像漂浮物的东西。我认为你的代码片段适合这个en.cppreference.com/w/cpp/language/floating_literal
-
MS 文档,但我认为它应该普遍适用于 gcc 并且它有很多示例:msdn.microsoft.com/en-us/library/w9bk1wcy.aspx
-
这里的答案提到了语言的这个奇怪的角落:stackoverflow.com/a/41701152/1566221
-
显然这是错误gcc.gnu.org/bugzilla/show_bug.cgi?id=3885的原因。见 C11 6.4.8。不过,我对这些晦涩难懂的事情了解得不够多,无法写出答案。
-
@Lundin,我以为翻译阶段 7 已经被预处理器覆盖了?错误与否,这不是我的问题。我只是试图找到一种写出 0x4e+33 这样的总和的好方法。写 (0x4e)+33 似乎有点过头了,所以可能 rici 是对的,空格 是 约定。