我想让我的代码在传统C++ (使用“NULL”的C++代码)和新的C++11标准(使用“nullptr”的C++代码)上都是可编译的。
我使用的是GCC,但我计划在完成最重要的事情时,也为VS重新编译整个代码库。
我应该期望GCC和VS都会这样做吗?
#define NULL nullptr或者我自己来做更好(当然使用一个不同的名称,其中MY_LIB将被我的库后缀取代)?
#ifndef nullptr
#define MY_LIB_NULL NULL
#else
#define MY_LIB_NULL nullptr
#endif我想要实现的是无论是否实现了C++11特性都可以编译的代码(因为我没有使用模板,所以它们很少)。
例如,关键字"override“和"final”已经完成。
MY_LIB_OVERRIDE //macro, defines to "override" if c++11 is present.
MY_LIB_FINAL //macro, defines to "final" if c++11 is present.我之所以问这个问题,是因为我知道"nullptr“这个问题有点奇怪,所以可能只做我对override和final做过的同样的事情是错误的。需要关于这方面的意见。任何帮助都是wellcome。
发布于 2012-12-03 23:26:38
您可以通过以下方式创建my_nullptr_t类型的"false“my_nullptr:
const class my_nullptr_t
{
public:
/* Return 0 for any class pointer */
template<typename T>
operator T*() const
{
return 0;
}
/* Return 0 for any member pointer */
template<typename T, typename U>
operator T U::*() const
{
return 0;
}
/* Safe boolean conversion */
operator void*() const
{
return 0;
}
private:
/* Not allowed to get the address */
void operator&() const;
} my_nullptr = {};这适用于C++03和C++11,并且无论实现哪种C++11功能,都应该始终是安全的。这个解决方案实际上已经在this topic中讨论过了,它提出了一个基于the Official proposal的nullptr_t版本。
发布于 2012-12-03 22:23:33
NULL是一个扩展为空指针常量的宏。它仍然像以前一样工作。必须使用非C++11编译器的代码应该使用NULL。
发布于 2012-12-03 16:44:56
我认为下面的will是可行的:
#include <cstddef>
#ifndef MY_LIB_NULL
#ifndef NULL //check for NULL
#define MY_LIB_NULL nullptr
#else
#define MY_LIB_NULL NULL ///use NULL if present
#endif
#endif基本上,我检查"NULL“。当编译器只提供" nullptr“并且不再使用nullptr时,它是有效的,然后使用nullptr(也许在很远的将来,但似乎我们可以很高兴地继续使用NULL!)
我认为这比重新定义"nullptr“更安全(就像大多数人试图做的那样)。
https://stackoverflow.com/questions/13675203
复制相似问题