我想知道我是否可以依靠标准报头中包含守卫的特定定义。如果我用Visual Studio查看我的系统,例如,我可以看到stdint.h定义了_STDINT
。我的问题是,如果我也可以依靠#define
来编译其他编译器。基本上,我这样做是安全的这样做:我可以依靠标准报头中的包含守卫
#ifndef _STDINT
typedef char int8_t;
#endif
我知道这可能看起来很愚蠢。为什么不只是包含stdint.h你说?那么我正在编写可能部署嵌入式目标的代码,这可能并不满足于包含某些标准c头文件。但是,我希望能够在可用时使用它们。因此,我希望能够在具有int main()
的文件中选择是否要包含stdint.h。
简短的答案是否定的,长的答复是亲爱的神 - 不要 - 做这个。下划线#define仅为文件范围保留,因此在该文件之外使用它们是充满风险的。 处理这个(imho)的正确方法是提供你自己的“stdint.h”,如果它在目标机器上找不到的话。我会做一个可选的包含目录,如果编译器不兼容c99/posix,则包含该目录。然后用'#include“stdint.h”'包含stdint。 – IdeaHat 2014-10-27 14:29:24
“一个可选的包含目录,如果编译器不兼容c99/posix,则包含该目录”。原谅我的无知。我怎么做?通过编译器标志?或者根据c99配置我的系统的另一个头文件定义了什么? – xaviersjs 2014-10-27 14:32:55
@xaviersjs它依赖于编译器,但是,它通常归结为给编译器一条额外的路径。 – user694733 2014-10-27 14:36:14