【问题标题】:NUL undeclared- first use in this functionNUL 未声明 - 在此函数中首次使用
【发布时间】:2012-05-19 18:29:55
【问题描述】:

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

知道为什么会出现此错误吗?

【问题讨论】:

    标签: c nul


    【解决方案1】:

    NULL,然后有 NUL

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

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

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

    #define NUL '\0'
    

    【讨论】:

      【解决方案2】:

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

      #define NUL 0
      

      我推断您不是在寻找NULL,因为您正在寻找ch == NUL

      在各种文本中,经常将'\0' 称为NUL

      【讨论】:

      • 但是下面的链接说 C 有一个关键字“NUL”。 www.allinterview.com/showanswers/27930.html
      • @Tinyspark 实际上那个帖子里很多人说NUL 不标准。
      • 如果这是他的意图,那么只需说“*pszDest = 0;”就可以使代码更具可读性,避免其他人不得不去寻找非标准定义的麻烦在标准 C 编程操作中使用的常量(即终止字符串)。
      • @Tiny,该链接没有说明任何内容:“C 中没有标准宏 NUL,但有些人喜欢定义它。”
      • 它不是关键字,而是宏。
      【解决方案3】:

      这是NULL,而不是NUL

      编辑

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

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

      【讨论】:

        【解决方案4】:

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

        C 和 C++ 之间以及 C++ 内部的 NULL 值 概念问题 C++98、C++0x 和 C++11 并不新鲜,这就是为什么从 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
        

        【讨论】:

          猜你喜欢
          • 2014-04-22
          • 2012-05-07
          • 2012-07-13
          • 2013-05-19
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多