【问题标题】:Can I include different files based on platform?我可以根据平台包含不同的文件吗?
【发布时间】:2018-11-11 01:32:55
【问题描述】:

我包含的一个头文件似乎只存在于 Linux 机器上,而不存在于 MacOS 机器上。虽然我可以使用 VM 来编译和运行代码,但如果能够在 MacOS 中执行此操作,那就太好了。

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

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

【问题讨论】:

  • 您可以在#if#endif 行之间有一个#include 行。如果这不能回答您的问题,您能否更具体一些?
  • 您发布的链接中有信息显示了如何执行此操作。
  • 这个问题比@AlejandroVisiedo 链接的问题要具体得多——我问的是特定于平台的包含,而另一个问题是问的是特定于平台的宏。
  • @AlejandroVisiedo - 这是一个很好的“相关”链接,但答案(和 cmets)引用了断开的链接等。我不确定是否值得依靠那个来关闭这个作为权威答案。

标签: c c99


【解决方案1】:

Clang 和 GCC 支持 __has_include 预处理器条件,您可以使用它来代替测试平台定义:

#if __has_include(<endian.h>)
#include <endian.h>
#else
#include "endian.h"
#endif

不过,需要注意的一点是,由于 &lt;endian.h&gt; 不是标准标头,它可能存在于另一个平台上,但定义不同,对您没有帮助。

这和我前几天写的this other answer有关。

【讨论】:

    【解决方案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,这将为您提供 Unixgcc 的所有标题,就像热情一样。这是对我的回答的改进,我知道我忘记了一些东西:(哦,我只使用 Mac 几次进行开发:S

    • 从 Xcode Preferences->Downloads 窗口安装命令行工具,或者
    • 从终端命令行执行 xcode-select --install。

    这是参考:

    endian.h not found on mac osx

    【讨论】:

      猜你喜欢
      • 2021-07-09
      • 2011-01-18
      • 1970-01-01
      • 1970-01-01
      • 2020-05-31
      • 2018-08-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多