【问题标题】:Works in C, but not in C++ [duplicate]适用于 C,但不适用于 C++ [重复]
【发布时间】:2017-08-03 19:28:53
【问题描述】:

以下代码在 C 中编译,但在 C++ 中不编译:

int *ptr = 25; //why not in C++?

错误

prog.cpp: In function ‘int main()’:
prog.cpp:6:11: error: invalid conversion from ‘int’ to ‘int*’ [-fpermissive]
  int *ptr = 25;

但这在 C 和 C++ 中都可以编译:

int *ptr = 0;  //compiles in both

为什么分配 0 可以正常工作,而其他数字则不行?

【问题讨论】:

  • 究竟是什么错误?
  • 因为0在指针上下文中具有特殊含义。
  • 0 是一个空指针常量; 25 不是有效的指针常量。第一个不应该在没有警告的情况下在 C 中编译。

标签: c++ c


【解决方案1】:

因为您不能在 C++ 中将 int 隐式转换为 int*,但是由于历史原因,0 可以,因为它经常用作 NULL 的值。

如果你想在 C++ 中做,你需要将数字显式转换为指针:

int *ptr = reinterpret_cast<int*>(25);

【讨论】:

  • 它不经常用作NULL的值,在nullptr到达之前,0是C++中的官方值。 NULL 来自 C.
  • 好的,谢谢!我会检查一下。 @汤米安徒生
  • @Slava 在 C++ 实现中 NULL 被 #定义为 0 是很常见的——它还能有什么其他值(在 nullptr 之前)?
  • @NeilButterworth 我可能无法清楚地表达自己 - 声明 0 经常用作 NULL 的值,并且它在 C++ 中工作的原因是不正确的。 0 是在 c++03 中表达nullptr 的标准方式,这就是原因。正因为如此,NULL 在 C++ 中是这样定义的,反之亦然。
  • @Slava in C++ NULL 是实现定义的,nullptr 是在 C++11 中引入的,而不是 C++03,也就是说 0 不是它的官方定义。跨度>
猜你喜欢
  • 2021-09-25
  • 2012-03-09
  • 1970-01-01
  • 2017-03-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多