如何可移植地检测编译器是否支持<iostream> vs <iostream.h> </iostream.h> </iostream>

时间:2011-12-16 06:16:51

标签: c++ perl perl-xs

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

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

一点背景:该实用程序是Perl的Inline :: CPP语言扩展。该附加信息会自动包含<iostream>,并会尝试猜测是否有&#39; .h&#39;是否需要(当然,编译器是否支持名称空间)。但是在这方面它还远非完美,而且这个问题正在削弱实用性的广度。

所以重申一个问题:如何可移植地检测编译器是否支持<iostream>等标准头文件,或<iostream.h>之类的标准头文件?

2 个答案:

答案 0 :(得分: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&lt; iostream.h&gt;例如。

然后在你的普通代码中只有一个

#ifdef PRE_STANDARD_HEADERS

会做到这一点。

答案 1 :(得分:1)

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

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