【发布时间】:2014-10-27 14:24:47
【问题描述】:
我想知道我是否可以依赖标准头文件中包含保护的特定定义。例如,如果我使用 Visual Studio 查看我的系统,我可以看到 stdint.h 定义了 _STDINT。我的问题是我是否也可以将这个#define 用于其他编译器。基本上,我这样做是否安全:
#ifndef _STDINT
typedef char int8_t;
#endif
我知道这可能看起来很愚蠢。为什么不只包括你说的 stdint.h ?好吧,我正在编写可能部署嵌入式目标的代码,这可能对包含某些标准 c 标头不满意。但是,我希望能够在它们可用时使用它们。因此,我希望能够在具有int main() 的文件中选择是否要包含stdint.h。
【问题讨论】:
-
简短答案是否定的,而长答案是亲爱的上帝不要这样做。下划线 #defines 仅保留用于文件范围,因此在该文件之外使用它们充其量是有风险的。处理这个(恕我直言)的正确方法是提供您自己的“stdint.h”,如果在目标机器上找不到它。我会做一个可选的包含目录,如果编译器与 c99/posix 不兼容,则包含该目录。然后将 stdint 包含在
#include "stdint.h"中。 -
“一个可选的包含目录,如果编译器不兼容 c99/posix 则包含该目录”。原谅我的无知。我怎么做?通过编译器标志?还是根据 c99 定义配置我的系统的另一个标头?
-
@xaviersjs 它依赖于编译器,但是是的,它通常归结为为编译器提供一个额外的路径。
-
@xaviersjs 这不应该在头文件中处理,而是作为您正在使用的任何构建系统的一部分,我想。我个人使用 CMake,所以
CHECK_INCLUDE_FILE_CONCAT ("stdint.h" H4H5_HAVE_STDINT_H)会处理这个问题,但您必须按照自己的意愿进行设置。 -
@MadScienceDreams 您的答案会在几种情况下中断,而无需事先进行某种
configure流程。至少在 GCC 上(可能还有其他一些编译器),用户定义的包含路径(即那些作为-I传递的路径)包含在 before 系统包含目录中;因此,即使系统确实有自己的stdint.h,这个“可选”包含将始终被包含在内。有时这可能就足够了(例如,如果已知整个应用程序及其所有编译时依赖项仅使用一小部分定义良好的子集)。
标签: c include-guards