【问题标题】:In C programming macros never do type check? Then what is the difference in defining macro for 0x01 and 0x01u?在 C 编程宏中从不进行类型检查?那么为 0x01 和 0x01u 定义宏有什么区别呢?
【发布时间】:2024-01-21 11:18:01
【问题描述】:

他们说 c 中的宏从不检查数据类型,它只是将左侧替换为右侧。那为什么人们将 0x01u 明确定义为可以简单地说为 0x01 呢?

【问题讨论】:

  • 在使用宏的地方进行检查
  • 宏(预处理器)不进行类型检查;当使用扩展宏的结果时,编译器会这样做。
  • "...宏从不进行类型检查" - 这可能意味着不止一件事。澄清一下,您具体要问什么。
  • 谢谢,Bernd Elkemann 和 Jonathan Leffler。我明白了你的意思,所以在我的宏被 0x01u 替换的代码中,它将被视为无符号整数,而对于 0x01,它被简单地视为有符号整数。
  • 这个问题还不错。 Bernds & Jonathans cmets 会是一个很好的答案。

标签: c macros


【解决方案1】:

在使用宏的地方进行检查——Bernd Elkemann

宏(预处理器)不进行类型检查;当使用扩展宏的结果时,编译器会这样做。 ——乔纳森·莱弗勒

【讨论】:

    【解决方案2】:

    它定义了一个unsigned 整数文字。您还可以使用0x…UL 来查看他们将十六进制文字定义为unsigned long 整数的位置。

    如果您想知道它们产生的位模式,只需将十进制文字转换为等效的十六进制或二进制文字即可。 1U 分别变成十六进制和二进制的 0x01U01b1

    另一个更常见的文字使用 f 后缀,即像 1.0f 这样的单精度浮点文字。

    1.仅供说明;不是根据 C 标准的实际有效的二进制文字。 C++14 支持0b01 用于二进制文字(也很有趣,比如0b0000'0001' 作为分组字符)。

    【讨论】:

    • 请再次阅读问题,您的回答似乎对 OP 没有帮助
    • @Rakesh_K 我虽然在问 U 符号的目的是什么。所以我删除了我的帖子。感谢您通知我。
    最近更新 更多