2

网上我了解到 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

4 回答 4

12

NULL,然后有NUL

NULL 在 stddef.h 中定义,使用非常广泛,是对空指针的引用。

NUL 不同——它是标准 ASCII 字符集中的第一个字符,更重要的是,它不是标准宏。您可能必须自己定义它。

要定义 NUL,请执行以下操作:

#define NUL '\0'
于 2012-05-11T06:43:25.207 回答
4

不,这不是标准。在代码的开头添加此代码或仅使用0

#define NUL 0

我推断你不是在寻找,NULL因为你在做ch == NUL

在各种文本中,经常提到'\0'as NUL

于 2012-05-11T06:41:33.907 回答
2

NULL,不是NUL

编辑

您甚至阅读过您发布的链接吗?它非常明确地说“NULL 不是 NUL。NUL 不是 C++ 中定义的关键字”

NULL 是为空指针定义的宏。
NUL 是 ASCII 字符集中第一个字符的名称。它对应于零值。C 中没有
标准的宏 NUL,但有些人喜欢定义它。
数字 0 对应于十进制值 80。不要混淆数字 0 和 ?? (无)!
NULL 可以定义为 ((void*)0),NUL 可以定义为??。

于 2012-05-11T06:41:35.327 回答
2

定义你自己的 NULL 值不是标准的,而且很容易出错,而且在最好的情况下,这肯定会让你没有睡眠和头痛。

C 和 C++ 之间以及 C++ 98、C++0x 和 C++11中的NULL 值概念的问题并不新鲜,这就是为什么从 C++0x 开始引入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
于 2015-09-17T14:41:44.650 回答