C ++ 11功能的可用性

时间:2015-05-16 16:07:20

标签: c++ c++11

编译器供应商已经采用零散的C ++ 11功能,这是可预测的,因为其中许多功能都不易实现。

报告编译器完全支持的规范的标准方法是通过__cplusplus预定义的宏。但是,主要供应商报告__cplusplus = 199711L,这意味着他们只是完全支持C ++ 98(例如MSVC14)。这(大概)意味着它们并不完全支持C ++ 11规范,即使它们可能实现了大部分功能。

我想开始使用C ++ 11功能,当它们可用时(并且当它们不可用时回退到现有代码)。但是,我的代码必须支持许多编译器,包括我可能无法使用的专有编译器。是否有任何标准方法可以知道编译器可以使用哪些C ++ 11功能,而不知道具体使用哪个编译器? (如果编译器以非标准方式运行,则检测行为可能不正确)。

注意:这个问题是对我的问题“Availability of static_assert c++11”的概括,这个问题并不是很受欢迎,因为我觉得我的动机被误解了。

3 个答案:

答案 0 :(得分:5)

您可能对feature test macros感兴趣,这使您可以测试特定的C ++ 11,C ++ 14甚至C ++ 17功能,例如P,{{1} }或io.socket.on('connect', function connected() { // Subscribe using Socket.GET io.socket.get('job'); io.socket.on('job', function jobReceived(message) { console.log("Got job", message); }); }); 。 Clang和GCC已经支持这一点,请参阅live demo

答案 1 :(得分:1)

g++ / clang++默认情况下没有启用C ++ 11,甚至没有最新版本。每当使用g++使用-std=c++11进行编译时,您的宏__cplusplus将具有预期值。

VS似乎默认启用了所有功能,感谢@Comic,但它没有更新宏,因为它还不完全符合C ++ 11。

就检测通用编译器的“C ++ 11可用性”而言,我不知道有任何可移植的方法,除非您检查__cplusplus宏。但是,正如您所观察到的那样,默认情况下可能不会为某些编译器实现宏(如g++ / clang++的情况),或者根本没有实现(VS)。你在这个阶段唯一的选择似乎是像CMake这样的外部工具,它可以检测编译器,并且以编译器类型为条件,然后CMake可以定义一些宏,你可以在代码中检查它以启用C ++ 11。

答案 2 :(得分:-1)

我认为许多C ++ 11功能也可以在GCC 4.8上使用。使用-std = c ++ 11选项编译程序。

我认为一些C ++ 11功能也在GCC 4.6.3中。编译选项以启用它-std = c ++ 0x。