我可以根据平台包含不同的文件吗?

时间:2018-06-01 00:08:30

标签: c c99

我包含的头文件似乎只存在于Linux机器上,而不是存在于MacOS机器上。虽然我可以使用VM来编译和运行代码,但能够在MacOS中执行此操作会很不错。

更具体地说,我使用的是#include <endian.h>,它在Linux上编译,我想将this compatibility header用于MacOS,我将#include "endian.h"包括在内。我的代码按照预期编译并执行,前者包含在Linux机器上,后者包含在MacOS机器上。

有没有办法在标题中使用特定于平台的包含(可能使用某种基于#if的语法)?或者这是不好的做法?

2 个答案:

答案 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

  • 从Xcode首选项 - >下载窗口或
  • 安装命令行工具
  • 从终端命令行执行xcode-select --install。

以下是参考资料:

endian.h not found on mac osx