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

标签 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]);

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

最佳答案

虽然这个问题在某种程度上与十六进制浮点常量有关,但问题的根本原因并不是因为 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(大写或小写)。

当然,这与浮点常量(十六进制或其他)有关,因为这就是为什么 - 字符可以在预处理数字标记的中间结束。但是,请注意,您将收到类似 0xx11F22bad_token 之类的标记的错误消息,它们与十六进制浮点常量没有任何相似之处。

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

关于c - 整数常量的无效后缀 "-252",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11977943/

相关文章:

c - 关于C指针的疑惑

c - 四线程分割进程C程序中的"Segmentation fault: 11"错误

java - 整数的反转数字 : How to find out if the number have overflown?

python - 将整数分配给字符串

c - 警告 : missing braces around initializer [-Wmissing-braces] (IN MACRO)

python - Cython cdef 没有速度增加

c - 从float转换为double会产生不同的结果-相同的代码,相同的编译器,相同的OS

c++ integer->std::string 转换。简单的功能?

javascript - Jquery/Javascript - 无法递增数字 (tweet-id)

C++ 分隔整数