我一直在尝试从 https://github.com/amree/mykad-c/blob/master/scdump.c 运行一个 C 文件,但在这部分代码中,我不断收到 Invalid suffix "-252"on integer constant
:
if (RxBuffer[0x11E-252] == 'P')
printf("Female\n");
else if (RxBuffer[0x11E-252] == 'L')
printf("Male\n");
else
printf("%c\n", RxBuffer[0x11E-252]);
我很确定它与语法相关。但我并不真正理解代码(我正在尝试,但我几乎被困住了)。谁能帮帮我?
最佳答案
虽然这个问题在某种程度上与十六进制浮点常量有关,但问题的根本原因并不是因为 0x11E
是十六进制浮点常量的开始(因为它不是一个十六进制 float 常量)。
问题是 0x11E-252
是单个 token ,而不是像 0x11F-252
那样的三个 token 。如果您查看 C99 6.4.8“预处理数字”,您会看到 pp-number 标记是:
A preprocessing number begins with a digit optionally preceded by a period (.)and may be followed by valid identifier characters and the character sequences e+, e-, E+, E-, p+, p-, P+, or P-
因此,0x11E-252
是单个标记,标记化发生在翻译阶段 3,但是当需要从句法和语义上解释标记时(发生在翻译阶段 7),它不是语法上有效,因此您会遇到编译器错误。
另一方面,0x11F-252
是三个标记,因为 -
不是预处理数字标记的一部分,除非它紧跟在 P< 之前
或 E
(大写或小写)。
当然,这与浮点常量(十六进制或其他)有关,因为这就是为什么 -
字符可以在预处理数字标记的中间结束。但是,请注意,您将收到类似 0xx11F
或 22bad_token
之类的标记的错误消息,它们与十六进制浮点常量没有任何相似之处。
修复是 as ouah noted , 在 -
之前插入空格以强制编译器将序列视为多个标记。如果这是您的代码,更好的解决方案可能是为所有这些神奇数字(枚举或宏)命名。后跟 -
的标识符不会被视为单个标记。另外,您希望能够使代码更加自文档化。
关于c - 整数常量的无效后缀 "-252",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11977943/