【问题标题】:Why is nullptr undeclared in C?为什么在 C 中未声明 nullptr?
【发布时间】:2017-07-27 11:06:27
【问题描述】:

我正在使用nullptr,因为它很方便并且使我的代码更具可读性。但是编译器在下面给了我错误。

我的问题是必须包含什么头文件才能解决问题。

这里有一段代码:

FILE *fptr;
fptr=fopen("E:\\text.txt","w");
if(fptr==nullptr)
{
   perror("open()");
   return  EXIT_FAILURE;
}

错误

 ||=== Build: Debug in 1 (compiler: GNU GCC Compiler) ===|
 E:\COOP\1\main.c||In function 'main':|
 E:\COOP\1\main.c|12|error: 'nullptr' undeclared (first use in this function)|
E:\COOP\1\main.c|12|note: each undeclared identifier is reported only once for each function it appears in|
 E:\COOP\1\main.c|27|error: expected declaration specifiers or '...' before

【问题讨论】:

  • C 没有 nullptr 关键字或别名。它仅存在于 C++ 中。
  • @Ceeker:你的 IDE 在将 C++ 语言引入 C 代码时很顽皮。
  • 那么似乎 CodeBlocks 中存在一个错误,因为它不区分 C 和 C++ 源。如果您键入 ne,IDE 是否会尝试将其替换为 new(另一个仅限 C++ 的关键字)?如果是这样,那么问题可能是一般性的,而不仅仅是一个或几个关键字。
  • 别再舒服了!您如何对具有自动完成功能的 IDE 感到满意,该功能可以自动完成来自错误语言的标识符和关键字。接下来是什么? mysql_real_escape_string??
  • 我会去their ticket system 并将其报告为错误。他们确实需要将 C 和 C++ 分开。

标签: c pointers gcc


【解决方案1】:

nullptr is C++ only;在 C 中不需要它,因为在 C 中 ((void*)0) 可以转换为任何其他指针类型而无需强制转换。

如果你真的很喜欢在 C 中输入nullptr,你可以使用

#define nullptr ((void*)0)

然后它的工作原理基本相同。


请注意,C 具有来自 <stddef.h>NULL 宏;它也是可读的,但它的扩展是实现定义的,所以它可能是 ((void*)0)0 (或者非常奇怪的东西);如果它扩展到0,您将无法从

获得任何诊断信息
int a = NULL;

【讨论】:

  • @Ceeker - NULL 也是如此。但是 NULL 在 C++ 中必须定义为 0,这会导致 nullptr 解决的歧义。
  • @StoryTeller 实际上,#define NULL nullptr 不能在 C++ 中工作吗?
  • @Ceeker - 尽管我喜欢 nullptr 作为一个概念,但如果你希望你的 C 代码是惯用的,你必须使用 NULL。
  • @AnttiHaapala - 它会工作。但它是一个给关键字起别名的宏,哎呀。
  • 带有“((void*)0) 可以转换为任何其他指针类型而无需强制转换。”,-我怀疑这是否适用于函数指针。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-10-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多