整数常量上的后缀“-252”无效

时间:2012-08-15 21:57:44

标签: c integer

我一直在尝试从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]);

我很确定它的语法相关。但我真的不懂代码(我正在尝试,但我几乎被卡住)。任何人都可以帮助我吗?

2 个答案:

答案 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是三个令牌,因为-不是预处理号码令牌的一部分,除非它前面有PE(上层)或小写)。

当然,这与浮点常量(十六进制或其他)有关,因为这就是-字符最终可以在预处理数字标记的中间结束的原因。但是,请注意,对于0xx11F22bad_token等令牌,您将获得类似的错误消息,这些令牌与十六进制浮点常量无关。

修复程序为as ouah noted,在-之前插入空格以强制编译器将序列视为多个标记。如果这是您的代码,更好的解决方案可能是为所有这些神奇的数字(枚举或宏)命名。后跟-的标识符不会被视为单个标记。另外,您希望获得使代码更自我记录的好处。

答案 1 :(得分:6)

0x11E-252

是C中的十六进制浮点常量,-252是指数部分。您会收到警告,因为您正在使用浮点常量初始化整数对象。

0x11E - 252  // Note the whitespace

是整数表达式。

使用后者具有所需的行为。

修改

我的回答其实并非如此。虽然修复没问题,但请参阅@MichaelBurr的答案,了解正在发生的事情的真实解释。 0x11E-252在C规则下作为单个标记读取,并且它不是有效的浮动(或整数)数字。