C ++ 11预定义的宏

时间:2011-08-28 21:15:17

标签: c++ c++11

是否有任何预定义的C ++宏,以便代码可以识别标准?

e.g。目前大多数编译器将“数组”放入“tr1”文件夹,但对于C ++ 11,它将成为STL的一部分。所以目前

#include <tr1/array>

但是c ++ 11

#include <array>

03标准和11标准的预定义宏是什么,我可以使用#ifdef来识别?

另外,我想C90和C99有宏?

Thanksx

4 个答案:

答案 0 :(得分:20)

来自here

  

在C ++ 0x中,宏__cplusplus将被设置为不同的值   来自(大于)当前的199711L。

您可以测试它的值以确定它是否是c ++ 0x然后

答案 1 :(得分:7)

...挑剔

您的特定问题不依赖于您的编译器,它取决于标准库的实现。

由于您可以自由选择与编译器提供的标准库不同的标准库(例如,尝试使用libc ++或stlport),因此没有任何编译器特定信息可以帮助您。

因此,您最好的选择是自己创建一个特定的头文件,您可以在其中选择一个或另一个(取决于构建选项)。

// array.hpp
#ifdef STD_HAS_TR1_ARRAY_HEADER
#include <tr1/array>
#else
#include <array>
#endif

然后记录编译器选项:

  

传递-DSTD_HAS_TR1_ARRAY_HEADER意味着std::tr1::array中定义<tr1/array>而不是默认<array>

你已经完成了。

答案 2 :(得分:7)

从草案N3242:

16.8 Predefined macro names                          [cpp.predefined]
...
   The name _ _ cplusplus is defined to the value 201103L when
   compiling a C++ translation unit. 155)
...
155) It is intended that future versions of this standard will
     replace the value of this macro with a greater value.
     Non-conforming compilers should use a value with at most five 
     decimal digits.

答案 3 :(得分:1)

最终,您将不得不使用特定于编译器的信息。至少,直到C ++ 0x变得更加广泛地实现。您基本上需要选择实现某些功能的驱动程序版本并在其上测试特定于编译器的宏。

Boost.Config库有许多可以帮助您的宏。