我有这个thiis行:
while (**arr != NULL)
在这一行中我收到此错误:
identifier "NULL" is undefined
我收录了这个图书馆:
#include<stdlib.h>
但我仍然得到上面的错误。想知道如何修复此错误?
答案 0 :(得分:5)
事实上,stdio.h
和stdlib.h
都需要定义NULL
,all 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.h
或stdlib.h
中删除NULL,但他们没有任何理由将其从{{1}中删除}。
在替代方案中,只需使用stddef.h
作为空指针常量。只要你的所有功能都有原型,那就是完美的风格。 (你必须将它强制转换为一个带有可变数量参数的函数,例如0
,但你必须强制转换 NULL 将它正确传递给一个函数采用可变数量的参数,因此它出现在洗涤中。)
1 历史学家的脚注:是的,链接文档确实是 ANSI C标准,而不是ISO标准,具有相同的措辞(但截面编号非常不同)一年后出来的。我不知道可以在线免费获得1990版ISO C标准的副本。