c - 显然 NULL 在包含的文件中是未知的

标签 c gcc c-preprocessor

我遇到了一个奇怪的问题:

我有一个主要的开头:

#include <stdlib.h>     /* this defines NULL */
#include <stdio.h>      /* ditto */
#include <fcntl.h>
#include <ctype.h>      /* ditto */
#include <unistd.h>     /* ditto */

#include <linux/input.h>

#include <string.h>     /* ditto */
#include <sys/ioctl.h>

#include "parse.h"

...但是在包含的文件中:

#define NULL ((void*)0)  /* I need this! */

struct parse_key {
    char *name;
    unsigned int value;
} keynames[] = {
    {"KEY_RESERVED", 0},
    {"KEY_ESC", 1},
    {"KEY_1", 2},
    {"KEY_2", 3},
    ...
    {"KEY_MAX", 0x2ff},
    {NULL, 0}
};

我需要重新定义 NULL,否则我会得到错误:“错误:‘NULL’ undeclared here (not in a function)”。

注意:NULL 在主文件中定义的;如果我尝试 #define 我得到:“警告:“NULL”重新定义”

修复很简单,但我不明白发生了什么。有人可以点亮一下吗?

最佳答案

不要重新定义它。

只包括<stdlib.h>在你的头文件中

也不要在头文件中定义任何函数和数据。仅类型声明、外部变量、函数声明和静态内联函数(如果它们在多个 C 文件中使用)。

关于c - 显然 NULL 在包含的文件中是未知的,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53886332/

相关文章:

c - 如何将 2^63 添加到带符号的 64 位整数并将其转换为无符号的 64 位整数而不在中间使用 128 位整数

c - 如何计算存储的EIP地址

C++11 GCC 4.6.2 std::move

c++ - 仅为 Qt Creator 中的 Release 构建添加预处理器定义

ios - #define vs self.method检查分配

c++ - 如何禁用 boost::wave 的部分概念检查?

c - 数组传递给带有 const 参数的函数

c++ - 为什么不能用 GCC 生成静态二进制文件

c++ - 实现完美转发到 std::thread 的函数

c - 如何鼓励 C 程序中的未定义行为/乱序执行?