有没有办法在编译时检测编译器是否支持C++ 11的某些功能?例如,像这样:
#ifndef VARIADIC_TEMPLATES_SUPPORTED
#error "Your compiler doesn't support variadic templates. :("
#else
template <typename... DatatypeList>
class Tuple
{
// ...
}
#endif
Run Code Online (Sandbox Code Playgroud) 迭代器的含义在C++ 98和C++ 11之间作为位置提示std::set::insert(iterator position, const value_type& val)和std::multiset::insert(iterator position, const value_type& val)更改传递.在编译时是否有一种简单的方法来检测哪些正在使用并使用不同的代码?
上C++ 11的一般检查并不似乎是一个好主意,(1,2),并且我没有看到合适Boost.Config宏.
具体来说,C++ 98 的文档说:
如果position指向要插入元素之前的元素,则该函数会优化其插入时间.
而对于C++ 11,它说:
如果position指向将跟随插入元素的元素(或者到最后,如果它是最后一个元素),则该函数优化其插入时间.
这很重要,因为提示会影响插入调用的复杂性.如果提示正确,则复杂性仅为摊销常数.但如果不是,它的大小就是对数.
正如下面JerryCoffin所描述的那样,C++ 98规范本质上是一个错字.
为什么下面的代码会编译?
#ifdef C++11
// ...
#endif
int main() {}
Run Code Online (Sandbox Code Playgroud)
gcc 4.8.0 给了我以下警告:
#ifdef 指令末尾的额外标记
根据标准,宏名称只能包含字母、数字和下划线字符。
也许是因为这个?
ISO/IEC 14882:2011
16.1 条件包含 [cpp.cond]
6 按顺序检查每个指令的条件。如果它评估为假(零),则跳过它控制的组:指令仅通过确定指令的名称进行处理,以跟踪嵌套条件的级别;指令的其余预处理标记将被忽略,组中的其他预处理标记也将被忽略。仅处理其控制条件评估为真(非零)的第一组。如果所有条件的计算结果都不为真,并且存在 #else 指令,则处理由 #else 控制的组;缺少#else 指令,直到#endif 的所有组都被跳过。151
我无法正确理解这句话。
我正在编译一个使用 C++ 关键字“override”的 C++ 程序。
我在 Visual Studio 2010 中编译成功,但现在我需要在 g++ 上编译它。只有 g++ 4.6 可用(并且您需要 g++ 4.7 来支持“覆盖”)。
真正的解决方案是安装 g++ 4.7(现在正在发生),但这让我开始思考。是否有编译时检查来查看是否支持关键字?
我试过:
#ifndef override
#define override
#ifdef BUILD_WINDOWS
#pragma message("The \"override\" keyword is not supported on this compiler! Ignoring it!")
#else
#warning "The \"override\" keyword is not supported on this compiler! Ignoring it!"
#endif
#endif
Run Code Online (Sandbox Code Playgroud)
这是行不通的,因为“覆盖”不是一个符号。
我想要一些更通用的东西,而不是简单地检查编译器版本以查看它是否是支持该关键字的版本之一。如果可以的话,如何才能做到这一点?