我包含的头文件似乎只存在于Linux机器上,而不是存在于MacOS机器上。虽然我可以使用VM来编译和运行代码,但能够在MacOS中执行此操作会很不错。
更具体地说,我使用的是#include <endian.h>
,它在Linux上编译,我想将this compatibility header用于MacOS,我将#include "endian.h"
包括在内。我的代码按照预期编译并执行,前者包含在Linux机器上,后者包含在MacOS机器上。
有没有办法在标题中使用特定于平台的包含(可能使用某种基于#if
的语法)?或者这是不好的做法?
答案 0 :(得分:4)
Clang和GCC支持__has_include
预处理器条件,您可以使用它来代替测试平台定义:
#if __has_include(<endian.h>)
#include <endian.h>
#else
#include "endian.h"
#endif
有一点需要注意的是,由于<endian.h>
不是标准标题,因此它可能会出现在另一个具有不同定义且不真正帮助的平台上你。
这与我几天前写的this other answer有关。
答案 1 :(得分:2)
有没有办法在标题中使用特定于平台的包含(可能使用某种基于#if的语法)?
是:
#ifdef __MACH__
... // Mac headers
#elif __unix__
... // these will work for Linux/Unix/BSD even for Mac in most cases
#elif _WIN32
... // windows 32 bit
#elif _WIN64
... // windows 64 bit
#endif
或者这是不好的做法?
我不这么认为
另一个解决方案,如果我没记错的话,就是在Mac上安装Command Line Tool
,它会为gcc
Unix
中的所有标题提供激情。这是我的答案的改进,我知道我忘记了一些事情:(哦,我只用了几次Mac开发:S
以下是参考资料: