C预处理器扩展到另一个类似对象的宏

时间:2013-06-21 15:35:01

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

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

#include <stdint.h>
#define BUFFER_SIZE UINT16_MAX

我期望BUFFER_SIZE为(65535),就像在stdint.h中定义UINT16_MAX一样,但编译器抱怨UINT16_MAX未定义。显然,宏观扩张并没有像我想的那样发生。

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

对几条评论的回应:

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

  • 有人提到定义__STDC_LIMIT_MACROS - 在尝试将stdint.h包含在内之前,我已经尝试过定义它。

ANSWER

所以它是__STDC_LIMIT_MACROS但更复杂。

  1. #define位于头文件(包括stdint.h)
  2. 在包含stdint.h之前,我在此文件中有#define __STDC_LIMIT_MACROS
  3. 我将该头文件包含在另一个源文件中。这个其他源文件也是#include stdint.h并在包含我的标题之前这样做了。因此,当首次包含stdint.h时__STDC_LIMIT_MACROS未定义
  4. 我的解决方案只是将-D__STDC_LIMIT_MACROS添加到我的编译器参数中。

2 个答案:

答案 0 :(得分:6)

你似乎正在使用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))

答案 1 :(得分:3)

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

如果您使用的是C ++ 11,请改为包含C ++标题<cstdint>