为什么我得到NULL是未定义的错误?

时间:2018-05-16 20:50:05

标签: c

我有这个thiis行:

while (**arr != NULL)

在这一行中我收到此错误:

identifier "NULL" is undefined

我收录了这个图书馆:

#include<stdlib.h>

但我仍然得到上面的错误。想知道如何修复此错误?

1 个答案:

答案 0 :(得分:5)

事实上,stdio.hstdlib.h都需要定义NULLall the way back to the original ANSI C standard in 1989 1 (不幸的是,这是一个.txt文件,因此我无法链接到特定部分;搜索4.9 INPUT/OUTPUT <stdio.h>和/或4.10 GENERAL UTILITIES <stdlib.h>,然后向下滚动一点)。如果是最小化的测试程序之一

#include <stdio.h>
void *p = NULL;

#include <stdlib.h>
void *p = NULL;

无法编译到目标文件,然后您的C实现有问题。 (如果上面的测试程序没有 无法编译,那么你需要在你的实际程序中做一些delta-minimization,然后可能会找到你认为它的那个明智的牛人将#undef NULL放在应用程序头文件中会很有趣。)

NULL也需要在其他几个标准头文件中定义,但是它的 true home,正如你可以从对4.1.5节的交叉引用中猜到的那样解释什么是NULL应该是定义,是stddef.h。未能在NULL中定义stddef.h的C实现非常错误。此外,stddef.h是“独立实施”要求提供的极少数标题之一;如果您在嵌入式环境中工作,他们可能会认为他们可以从stdio.hstdlib.h中删除NULL,但他们没有任何理由将其从{{1}中删除}。

在替代方案中,只需使用stddef.h作为空指针常量。只要你的所有功能都有原型,那就是完美的风格。 (你必须将它强制转换为一个带有可变数量参数的函数,例如0,但你必须强制转换 NULL 将它正确传递给一个函数采用可变数量的参数,因此它出现在洗涤中。)

1 历史学家的脚注:是的,链接文档确实是 ANSI C标准,而不是ISO标准,具有相同的措辞(但截面编号非常不同)一年后出来的。我不知道可以在线免费获得1990版ISO C标准的副本。