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

Mat*_*att 4 c c++ macros limit c-preprocessor

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

#include <stdint.h>
#define BUFFER_SIZE UINT16_MAX
Run Code Online (Sandbox Code Playgroud)

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

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

回复几条评论:

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

  • 一个人提到了定义__STDC_LIMIT_MACROS- 在尝试包含stdint.h之前我已经尝试过定义它.

回答

所以它__STDC_LIMIT_MACROS更复杂.

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

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

alk*_*alk 6

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

#define __STDC_LIMIT_MACROS
Run Code Online (Sandbox Code Playgroud)

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

/* 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))
Run Code Online (Sandbox Code Playgroud)