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

标签 c++ perl perl-xs

我正在开发一个需要能够在标准 C++ 编译器和准标准编译器上编译的实用程序。代码可以而且将会被扔到几乎任何现有的 C++ 编译器上。

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

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

所以重申这个问题:我如何可移植地检测编译器是否支持标准 header ,例如 <iostream> ,或预标准 header ,例如 <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

会成功的。

关于c++ - 如何可移植地检测编译器是否支持 <iostream> vs <iostream.h>,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8530502/

相关文章:

c++ - 错误 : ‘unique_ptr’ is not a member of ‘std’

Perl Mojolicious - 如何让它一次处理多个连接?

在嵌入式 C 应用程序中从 Perl 调用 C 函数

perl - 从头开始创建 XS 模块的现代方法是什么?

c++ - while true 循环函数

c++ - 返回常量引用参数而不复制

arrays - 如何将数组的每个成员乘以 perl 中的标量?

c - 安全释放 XS 代码中的资源(在作用域退出时运行析构函数)

c++ - Fstream 的 tellg/seekg 返回值高于预期

linux - 我可以使用命令行或 perl 更改终端位置吗?