编译器供应商已经采用零散的C ++ 11功能,这是可预测的,因为其中许多功能都不易实现。
报告编译器完全支持的规范的标准方法是通过__cplusplus
预定义的宏。但是,主要供应商报告__cplusplus
= 199711L,这意味着他们只是完全支持C ++ 98(例如MSVC14)。这(大概)意味着它们并不完全支持C ++ 11规范,即使它们可能实现了大部分功能。
我想开始使用C ++ 11功能,当它们可用时(并且当它们不可用时回退到现有代码)。但是,我的代码必须支持许多编译器,包括我可能无法使用的专有编译器。是否有任何标准方法可以知道编译器可以使用哪些C ++ 11功能,而不知道具体使用哪个编译器? (如果编译器以非标准方式运行,则检测行为可能不正确)。
注意:这个问题是对我的问题“Availability of static_assert c++11”的概括,这个问题并不是很受欢迎,因为我觉得我的动机被误解了。
答案 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。