我有如下代码(混合 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 但更复杂。
  • #define 位于头文件中(其中包括 stdint.h)
  • 在包含 stdint.h
  • 之前,我在这个文件中有 #define __STDC_LIMIT_MACROS
  • 我将该头文件包含在另一个源文件中。这个其他源文件也#include
    stdint.h 并在包含我的标题之前这样做。因此,当第一次包含 stdint.h 时,__STDC_LIMIT_MACROS 未定义

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

    最佳答案

    当您似乎在使用 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))
    

    关于c++ - C 预处理器扩展到另一个类似对象的宏,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/17239124/

    10-08 21:22