2011-08-28 67 views
23

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

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

#include <tr1/array> 

但C++ 11

#include <array> 

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

另外,我想有C90和C99的宏?

Thanksx

+1

它几乎没有与标准做的,这完全取决于你的编译器支持什么。任何编译器都会预先定义一个给出其版本号的宏。请查阅你的编译器文档 –

+0

[确定C++ 0x可用性](http:// stackoverflow。com/questions/1975616/determine-c0x-availability) –

+3

@Hans Passant:失败。 '在编译C++翻译单元时,名称_ _ cplusplus被定义为值201103L。(16.8预定义的宏名称)。 –

回答

20

here

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

你可以很可能测试它的价值,以确定它是否是C++ 0x或不那么

+1

请注意,虽然这可能是你可以做的最好的,但很遗憾它不适用于VC++(叹气)。目前的VC++(对于VS2010)将'__cplusplus'定义为199711L,但仍然只有'array'没有'tr1/array'(但它是用tr1命名空间定义的) – Voo

+0

嗯不好。虽然我猜他们处于困境。他们不能声称是符合0x的标准,因为他们只实现了它的一部分,而且标准仍然还有很长一段路要走 - 但是要实现他们按照标准完成的部分... – jcoder

+1

还要注意GCC修正它,使得'__cplusplus'仅在几周前报告了除'1'(注意:甚至不包括'199711L')之外的东西,所以它在GCC中也不适用,直到4.7.0不存在为止。另外,它并不完全清楚从错误归档中是否会支持比C++ 0x构建更大的“199711L”以外的东西(尽管我猜测它会)。请参阅http://gcc.gnu.org/bugzilla/show_bug.cgi?id=1773 - 10年以上的错误。 –

1

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

Boost.Config库有一些可以帮助你的宏。

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>定义。

你就完成了。

6

从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.