NUL未申报 - 首次使用此功能

时间:2012-05-11 06:40:16

标签: c nul

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++;
    }

知道我为什么会收到这个错误吗?

4 个答案:

答案 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