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

Dav*_*idO 0 c++ perl perl-xs

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

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

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

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

mat*_*tiu 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()
Run Code Online (Sandbox Code Playgroud)

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

然后在你的正常代码中只是一个

#ifdef PRE_STANDARD_HEADERS
Run Code Online (Sandbox Code Playgroud)

会做的伎俩.