4

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

#include <stdint.h>
#define BUFFER_SIZE UINT16_MAX

我期望BUFFER_SIZE(65535) 像UINT16_MAX在 stdint.h 中定义的那样,但编译器却抱怨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到我的编译器参数中。

4

2 回答 2

6

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

#define __STDC_LIMIT_MACROS

来自/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))
于 2013-06-21T15:56:06.060 回答
3

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

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

于 2013-06-21T15:58:08.873 回答