我想让我的代码在旧版 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 所做的那样,是错误的。需要对此的意见。欢迎任何帮助。
你可能会创建一个“假”my_nullptr
类型的my_nullptr_t
通过以下方式:
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 功能,都应该始终是安全的。该解决方案实际上已经在这个话题提出了一个版本nullptr_t
基于官方提案.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)