如何在不同的平台上使用不同的标头

How to have different Headers in different platforms?

本文关键字:平台      更新时间:2023-10-16

我对C++很陌生,我有一个文件,我必须在Linux和Windows中构建。

我想知道是否有一种方法可以在同一个文件中为 Windows 和 Linux 提供不同的 #include 列表,但不知何故,我告诉它这样做而不必每次都修改文件。

喜欢:

if_Windows
    #include <Include1>
if_Linux
    #include <Include2>

有可能做这样的事情吗?你是怎么做到的?

您可以定义在为 Windows 和 Linux 编译时设置的宏。

#define MYPROJECT_CONFIG_WINDOWS_PLATFORM
#if defined(MYPROJECT_CONFIG_WINDOWS_PLATFORM)
    #include <include1>
#elif defined(MYPROJECT_CONFIG_LINUX_PLATFORM)
    #include <include2>
#else
    #error link: no suitable library
#endif

然后,您所要做的就是在为 Window 编译时定义MYPROJECT_CONFIG_WINDOWS_PLATFORM,在为 Linux 编译时定义MYPROJECT_CONFIG_LINUX_PLATFORM

一些 IDE 还为它们正在编译的平台(如 Windows WIN32)提供了预设宏,但您必须查看它们的文档。

您需要

#ifdef与适合您的环境的宏结合使用。例如

#ifdef WIN32
 // Windows includes
#elseif __unix__
 // Unix included
#endif
您需要

检查编译器文档,了解它们为相应平台定义了什么。

使用 #if 预处理器指令:

#if defined(WIN32)
#include <foo_w.h>
#else
#include <foo_l.h>
#endif
哪个

定义使用哪个平台有点复杂,通常您的编译器有一些文档。

您需要使用预处理器。

见 http://www.cplusplus.com/doc/tutorial/preprocessor/

变量是定义的,通过使用#ifdef等,您可以为特定平台包含正确的内容

我的首选方法是

#include <myheader.h>

并使用编译器的包含路径来包含来自不同系统上不同文件夹的标头。


另一种方法是使用特定于平台和可能特定于编译器的预处理器符号来有条件地包含不同的标头,例如

#ifdef _WIN32
#    include <myheader.windows.h>
#else
#    include <myheader.nix.h>
#endif

其中_WIN32由编译器在 32 位和 64 位 Windows 平台中定义(请注意,这不是官方标准,只是事实标准)。


最后,第三,这种条件文本包含可用于让同一文件在不同的系统上提供不同的源代码。