【问题标题】:C Preprocessor Expansion to another object-like macroC 预处理器扩展到另一个类似对象的宏
【发布时间】:2013-06-18 19:32:20
【问题描述】:

我有如下代码(混合 C/C++ 应用程序)

#include <stdint.h>
#define BUFFER_SIZE UINT16_MAX

我期待 BUFFER_SIZE 是 (65535) 就像在 stdint.h 中定义的 UINT16_MAX 一样,但编译器却抱怨 UINT16_MAX 没有定义。显然,宏扩展并没有如我所愿。

我可以自己将其定义为 (65535),但想知道为什么这不起作用。

对几个 cmets 的回应:

  • 我的编译器确实支持 uint16_t 类型,UINT16_MAX 在 stdint.h 中定义

  • 有人提到定义 __STDC_LIMIT_MACROS - 在包含 stdint.h 无效之前,我曾尝试定义它。

回答

所以它是__STDC_LIMIT_MACROS,但更复杂。

  1. #define 位于头文件中(包括 stdint.h)
  2. 在包含 stdint.h 之前,我在此文件中有 #define __STDC_LIMIT_MACROS
  3. 我将该头文件包含在另一个源文件中。这个其他源文件也是#include stdint.h 并在包含我的标题之前这样做。因此,当第一次包含 stdint.h 时,__STDC_LIMIT_MACROS 没有定义

我的解决方案只是将-D__STDC_LIMIT_MACROS 添加到我的编译器参数中。

【问题讨论】:

  • 尝试包含limits.h
  • @VoidPointer - UINT_MAXlimits.h 中定义,但UINT16_MAXstdint.h 中定义(if 实现提供了精确的 16 位无符号类型)。
  • 你的编译器支持uint16_t吗?这不是必须存在的。
  • @VoidPointer - 确实如此。 “精确宽度无符号整数类型的最大值:{UINTN_MAX} 正好 2^N -1”。将N 替换为位数。

标签: c++ c macros limit c-preprocessor


【解决方案1】:

如果要包含 C++03 文件中的 C 标头,则需要在包含标头之前定义 __STDC_LIMIT_MACROS;否则它可能不会定义这些宏。

如果您使用的是 C++11,请包含 C++ 标头 &lt;cstdint&gt;

【讨论】:

    【解决方案2】:

    您似乎在使用 C++,您可能会这样做:

    #define __STDC_LIMIT_MACROS
    

    来自最近 Debian 的/usr/include/stdint.h

    /* The ISO C99 standard specifies that in C++ implementations these
       macros should only be defined if explicitly requested.  */
    #if !defined __cplusplus || defined __STDC_LIMIT_MACROS
    
    ...
    
    /* Maximum of unsigned integral types.  */
    # define UINT8_MAX              (255)
    # define UINT16_MAX             (65535)
    # define UINT32_MAX             (4294967295U)
    # define UINT64_MAX             (__UINT64_C(18446744073709551615))
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-01-04
      • 2020-10-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-09-18
      • 1970-01-01
      相关资源
      最近更新 更多