8

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

我很确定它与语法有关。但我并不真正理解代码(我正在尝试,但我几乎被卡住了)。谁能帮我?

4

2 回答 2

12

虽然这个问题在某种程度上与十六进制浮点常量有关,但问题的根本原因不是因为0x11E是十六进制浮点常量的开始(因为它不是十六进制浮点常量的开始)。

问题是它0x11E-252是单个令牌而不是像0x11F-252is 这样的三个令牌。如果您查看 C99 6.4.8 “预处理数字”,您会看到 pp-number 标记是:

预处理数字以数字开头,可选地以句点 (.) 开头,后面可以跟有效的标识符字符和字符序列 e+、e-、E+、E-、p+、p-、P+ 或 P-

因此,0x11E-252是单个标记,并且标记化发生在翻译阶段 3,但是当需要在语法和语义上解释标记时(发生在翻译阶段 7),它在语法上无效,因此您会收到编译器错误。

另一方面,0x11F-252是三个标记,因为-它不是预处理数字标记的一部分,除非它的前面紧跟一个PE(大写或小写)。

当然,这与浮点常量(十六进制或其他)有关,因为这就是-字符最终会出现在预处理数字标记中间的原因。0xx11F但是,请注意,对于类似于或22bad_token与十六进制浮点常量不相似的标记,您将收到类似的错误消息。

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

于 2012-08-16T00:06:10.483 回答
6
0x11E-252

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

0x11E - 252  // Note the whitespace

是一个整数表达式。

使用后者来获得所需的行为。

编辑

我的回答实际上是不正确的。虽然修复是可以的,但请参阅@MichaelBurr的答案以了解正在发生的事情的真正解释。0x11E-252在 C 规则下是作为单个标记读取的,它不是有效的浮点数(或整数)。

于 2012-08-15T22:02:25.887 回答