从the web我知道C包含NUL
个关键字。
但在编译时我收到错误
NUL undeclared first use in this function'
我的代码片段:
for (;;) {
char ch = (*pzDest = *pzSrc);
if (ch == NUL)
break;
if (ch == ':') {
*pzDest = NUL;
break;
}
pzDest++;
pzSrc++;
}
知道我为什么会收到这个错误吗?
答案 0 :(得分:11)
NULL ,然后是 NUL 。
NULL在stddef.h中定义,使用非常广泛,并且是对空指针的引用。
NUL与众不同 - 它是标准ASCII字符集中的第一个字符,更重要的是,它不是标准宏。您可能必须自己定义它。
要定义NUL,请执行:
#define NUL '\0'
答案 1 :(得分:4)
不,那不是标准。在代码的开头添加它,或者只使用0
:
#define NUL 0
我怀疑你不是在寻找NULL
,因为你正在做ch == NUL
在各种文本中,经常将'\0'
称为NUL
。
答案 2 :(得分:2)
它是NULL
,而不是NUL
。
修改
您是否阅读过发布的链接?它非常明确地说“NULL不是NUL.NUL不是C ++中定义的关键字”
NULL是为空指针定义的宏。
NUL 是ASCII字符集中第一个字符的名称。它 对应于零值。 C中没有标准的宏NUL, 但有些人喜欢定义它。
数字0对应于a 值80,十进制。不要将数字0与ε值混淆 (NUL)!
NULL可以定义为((void *)0),NUL可以定义为??。
答案 3 :(得分:2)
定义你自己的NULL值不是标准的,而且非常容易出错,这肯定会让你在最好的情况下没有睡眠和头痛。
C和C ++之间以及C ++ C ++ 98,C ++ 0x和C ++ 11中 NULL值概念的问题并不新鲜,这就是C ++的原因向前引入了 nullptr 宏,以避免问题并协调一些事情。
但是,如果您使用的代码继承了遗留NULL负载的问题:
根据您的配置,按照包含外部和库的顺序等,您可能需要确保按时定义NULL。
最简单的方法是包含“stddef.h”,请注意stddef.h的内容可能会有很大差异,具体取决于你的系统/ linux风格,这是一个例子:
#ifndef _LINUX_STDDEF_H
#define _LINUX_STDDEF_H
#undef NULL
#if defined(__cplusplus)
#define NULL 0
#else
#define NULL ((void *)0)
#endif
#endif
示例:
我遇到了尝试使用i2c库在Raspberry-pi上驱动i2c总线的问题。 在我的情况下,包括i2c lib是不够的,我不得不创建一个utils.h文件,我包括代替i2c lib头:
#ifndef UTILS_H
#define UTILS_H
/// if you have to use i2c-dev.h then use this utils header instead of make sure to include stddef.h before.
/// otherwise you will end up with the following error:
/// .../arm-unknown-linux-gnueabi/arm-unknown-linux- gnueabi/sysroot/usr/include/linux/i2c-dev.h:175: error: 'NULL' undeclared (first use in this function)
/// return i2c_smbus_access(file,value,0,I2C_SMBUS_QUICK,NULL);
/// ^
#include <stddef.h>
#include <linux/i2c-dev.h>
#endif // UTILS_H