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

amr*_*ree 8 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]);
Run Code Online (Sandbox Code Playgroud)

我很确定它的语法相关.但我真的不懂代码(我正在尝试,但我几乎被卡住).谁能帮我?

Mic*_*urr 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(大写或小写).

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

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


oua*_*uah 6

0x11E-252
Run Code Online (Sandbox Code Playgroud)

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

0x11E - 252  // Note the whitespace
Run Code Online (Sandbox Code Playgroud)

是一个整数表达式.

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

编辑:

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

  • 这不是警告,这是错误,因为十六进制 FP 常量使用 `p` 而不是 `e`(因为 `e` 是有效的十六进制数字)。这是一个 [link](http://stackoverflow.com/a/4825867/335858) 解释了 C99 的十六进制浮点常量。 (2认同)
  • 这是错的.它不是十六进制浮点常数.OP的编译器是错误的,并错误地将其视为一个.十六进制浮点数中的指数字符是"P"而不是"E". (2认同)