c++ - 为什么 C++ 的 NULL 通常是整数文字而不是像 C 中的指针?

标签 c++ c nullptr null-pointer cross-language

我已经写 C++ 很多年了,使用 nullptr对于空指针。我也知道 C,从那里 NULL 起源,并记住它是空指针的常量,类型为 void * .
出于某些原因,我不得不使用 NULL在我的 C++ 代码中。好吧,想象一下当在一些模板参数推导过程中编译器告诉我我的 NULL 真的是一个......长时我的惊讶。所以,我仔细检查了:

#include <type_traits>
#include <cstddef>

static_assert(not std::is_same<decltype(NULL), long>::value, "NULL is long ???");
事实上,静态断言失败(使用 GCC 和 Clang)。
我查了 cppreference.com ,果然(C++11 措辞):

The macro NULL is an implementation-defined null pointer constant, which may be an integer literal with value zero, or a prvalue of type std::nullptr_t.


为什么这是有道理的?就其本身而言,鉴于 C 的不兼容性?

最佳答案

C 不只是简单地定义 NULL(void *)0 .也可以将其定义为 0或任何计算结果的常量表达式。使用 #define NULL 0以任何一种语言工作。

关于c++ - 为什么 C++ 的 NULL 通常是整数文字而不是像 C 中的指针?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69057184/

相关文章:

c - 自由(): random error in recursive function

c - 最少三个值的最佳汇编或编译

c++ - 为 GCC 4.5.3 模拟 nullptr & nullptr_t

c++ - 使用 const std::string& 作为方法参数类型时,处理 nullptr const char* 的正确方法是什么?

c++ - 如何生成恰好有七个因数的数?

c++ - 将简单的宏作为函数参数传递给 'too few arguments in function call'

c - gcc(Ideone、codechef)上的 SIGSEGV 错误在 PC 上工作正常

c++ - unique_ptr 可以采用 nullptr 值吗?

c++ - C++去除字符串中连续重复的字符

c++ - 如何在模板函数中使用不同的结构作为模板参数?