我正在研究一个实用程序,需要能够在标准c++编译器和预标准编译器上编译。这些代码可以并且将会被抛出到几乎所有现存的c++编译器中。
我正在寻找一种方法来健壮地和可移植地确定目标编译器是否支持带有或不带有.h扩展名的头文件。我还需要检测是否支持名称空间。这两种需求都有可能实现,也有可能不实现。
一点背景知识:该实用程序是Perl的Inline::CPP语言扩展。扩展自动包含<iostream>
,并尝试很好地猜测是否需要'.h'(当然还有编译器是否支持名称空间)。但在这方面,它还远远不够完美,而且这个问题正在削弱该实用程序的可用性。
所以重申这个问题:我如何可移植地检测编译器是否支持标准头,如<iostream>
,或预标准头,如<iostream.h>
?
不是在代码中,而是在构建/配置系统中。例如,在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
那么在你的正常代码中只需要一个
#ifdef PRE_STANDARD_HEADERS
Linux和其他unix友好平台的标准方法是使用configure脚本。该脚本将生成一个Makefile和一个config.h头文件作为输出,该头文件用于打开或关闭代码可能依赖的任何编译器特性。
对于Windows,我们希望您提供Visual Studio的解决方案和项目文件,以及预生成的config.h头文件。