【发布时间】: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,但更复杂。
- #define 位于头文件中(包括 stdint.h)
- 在包含 stdint.h 之前,我在此文件中有 #define
__STDC_LIMIT_MACROS - 我将该头文件包含在另一个源文件中。这个其他源文件也是#include
stdint.h 并在包含我的标题之前这样做。因此,当第一次包含 stdint.h 时,
__STDC_LIMIT_MACROS没有定义
我的解决方案只是将-D__STDC_LIMIT_MACROS 添加到我的编译器参数中。
【问题讨论】:
-
尝试包含
limits.h -
@VoidPointer -
UINT_MAX在limits.h中定义,但UINT16_MAX在stdint.h中定义(if 实现提供了精确的 16 位无符号类型)。 -
你的编译器支持
uint16_t吗?这不是必须存在的。 -
@VoidPointer - 确实如此。 “精确宽度无符号整数类型的最大值:{UINTN_MAX} 正好 2^N -1”。将
N替换为位数。
标签: c++ c macros limit c-preprocessor