我一直在尝试从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]);
我很确定它的语法相关。但我真的不懂代码(我正在尝试,但我几乎被卡住)。任何人都可以帮助我吗?
答案 0 :(得分:12)
虽然这个问题与十六进制浮点常量有关,但问题的根本原因并不是因为0x11E
是十六进制浮点常量的开始(因为它不是十六进制浮点数的开始)常数)。
问题是0x11E-252
是一个令牌,而不是像0x11F-252
这样的三个令牌。如果你看一下C99 6.4.8“预处理数字”,你会看到一个pp-number标记是:
预处理编号以一个数字开头,可选地以句点(。)开头,后面可以跟有效的标识符字符和字符序列e +,e-,E +,E-,p +,p-,P +或P-
因此,0x11E-252
是单个标记,并且在翻译阶段3中进行标记化,但是当需要在语法和语义上解释标记时(在翻译阶段7中发生),它在语法上无效,所以你得到编译错误。
另一方面,0x11F-252
是三个令牌,因为-
不是预处理号码令牌的一部分,除非它前面有P
或E
(上层)或小写)。
当然,这与浮点常量(十六进制或其他)有关,因为这就是-
字符最终可以在预处理数字标记的中间结束的原因。但是,请注意,对于0xx11F
或22bad_token
等令牌,您将获得类似的错误消息,这些令牌与十六进制浮点常量无关。
修复程序为as ouah noted,在-
之前插入空格以强制编译器将序列视为多个标记。如果这是您的代码,更好的解决方案可能是为所有这些神奇的数字(枚举或宏)命名。后跟-
的标识符不会被视为单个标记。另外,您希望获得使代码更自我记录的好处。
答案 1 :(得分:6)
0x11E-252
是C中的十六进制浮点常量,-252
是指数部分。您会收到警告,因为您正在使用浮点常量初始化整数对象。
0x11E - 252 // Note the whitespace
是整数表达式。
使用后者具有所需的行为。
修改强>:
我的回答其实并非如此。虽然修复没问题,但请参阅@MichaelBurr的答案,了解正在发生的事情的真实解释。 0x11E-252
在C规则下作为单个标记读取,并且它不是有效的浮动(或整数)数字。