0

我正在开发一个需要能够在标准 C++ 编译器和预标准编译器上编译的实用程序。代码可以并且将被抛出几乎所有现有的 C++ 编译器。

我正在寻找一种方法来稳健且可移植地确定目标编译器是否支持带有或不带有 .h 扩展名的头文件。我还需要检测是否支持命名空间。这两种需求都可能是可能的,也可能是不可能的。

一点背景知识:该实用程序是 Perl 的 Inline::CPP 语言扩展。该扩展自动包含<iostream>,并尝试很好地猜测是否需要 '.h'(当然还有编译器是否支持命名空间)。但在这方面它远非完美,而且这个问题正在减少实用程序的用途的广度。

所以重申这个问题:我如何可移植地检测编译器是否支持标准头文件,例如<iostream>,或预标准头文件,例如<iostream.h>

4

2 回答 2

5

不在代码中,而是在构建/配置系统中。例如在 CMake 中,您可以使用try_compile并为其提供示例文件。

...
try_compile(PRE_STANDARD_HEADERS tmp_builds pre_standard_headers_test.cpp)
if ( ${PRE_STANDARD_HEADERS} )
    add_definitions( -D PRE_STANDARD_HEADERS )
endif()

您需要制作 pre_standard_headers_test.cpp .. 只是一个简单的可编译 exe,例如 #include <iostream.h>。

然后在您的正常代码中

#ifdef PRE_STANDARD_HEADERS

会成功的。

于 2011-12-16T06:34:50.273 回答
1

Linux 和其他 Unix 友好平台的标准方法是使用配置脚本。该脚本将生成一个 Makefile 和一个 config.h 头文件作为其输出,用于打开或关闭您的代码在可用时可能依赖的任何编译器功能。

对于 Windows,预计您将为 Visual Studio 提供解决方案和项目文件,以及预生成的 config.h 头文件。

于 2011-12-16T06:38:08.190 回答