【发布时间】:2025-11-27 20:10:02
【问题描述】:
我想让我的代码在旧版 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”问题有点奇怪,所以也许只是对覆盖和最终做同样的事情是错误的。需要对此发表意见。欢迎任何帮助。
【问题讨论】:
-
好像有些编译器实现者已经将NULL定义为“nullptr”,所以最安全的方法是直接使用NULL,如果nullptr存在就使用,如果nullptr不存在,那么NULL就是仍然安全.. 如果我们已经有 NULL,为什么还要使用“nullptr”?还是有可能实现者会放弃“NULL”(我认为极不可能)
-
#define NULL nullptr目前不应该合法,而且可能永远不会合法。NULL必须扩展为一个值为 0 的整数常量表达式。 -
哇,我很惊讶这样的改变是允许的;这有可能破坏大量代码(该代码可以说是“坏”代码,但委员会无论如何都不喜欢破坏代码)。不过,我的立场是正确的。不,我不认为
NULL会因为同样的原因而被删除:破坏代码,不管你喜不喜欢,通常都不能这样做。 -
@DarioOO 不能具体检测到
nullptr,但是可以检测C++11:#if __cplusplus >= 201103。 -
我没有在这个系统上安装 GCC 4.7,但它的值取决于你是否使用
-std=c++11/-std=gnu++11进行编译。在线浏览GCC source code,这已经实现(尽管不一定适用于 4.7)。
标签: c++ c++11 overriding final nullptr