c - 关于覆盖 linux 内核宏的一件有趣的事情

标签 c linux

在下面的代码中,编译成功并打印1024

#include <stdio.h>
#define FD_SETSIZE 512
#include <sys/types.h>

int main()
{
    printf("%d\n", FD_SETSIZE);
}

但是在下面的代码中,编译失败并打印

test.c:4:1: 警告:“FD_SETSIZE”重新定义 在/usr/include/sys/types.h:220 包含的文件中, 来自 test_fd.c:3: /usr/include/sys/select.h:81:1: 警告:这是之前定义的位置

代码是

#include <stdio.h>
#include <sys/types.h>
#define FD_SETSIZE 512

int main()
{
    printf("%d\n", FD_SETSIZE);
}

有人能解释一下吗?谢谢!

最佳答案

但是在下面的代码中,编译失败并打印

在问题中,两个程序都已编译,但是在编译第一个程序时,您在预处理器阶段收到警告。

预处理器阶段负责宏的替换。

在此示例中,预处理器使用最后定义的宏并替换它。

#include  <stdio.h>
#define  FD_SETSIZE 512
#include  <sys/types.h>

FD_SETSIZE 的定义在.c 文件和头文件sys/types.h 中都有。 文件包含后,会进行宏的替换,替换最新定义的宏。

因此最终替换的 FD_SETSIZE 将与 sys/types.h 文件中定义的相同,反之亦然。

希望对您有所帮助。

关于c - 关于覆盖 linux 内核宏的一件有趣的事情,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35716957/

相关文章:

encryption - 是什么导致 XOR 加密返回 "blank"?

c - struct {0} 和 memset 0 之间有什么区别

c - 错误 : typedef redefinition with different types ('unsigned short' vs '__darwin_size_t' (aka 'unsigned long' ))

c - 为什么标签的第一部分应该是声明?为什么不声明?

python - 超出主文件夹 .pyc 文件?

c++ - SDL 图像比例尺

c - 我应该在标题中使用 #include 吗?

linux - Linux Docker 中的 Umbraco

linux - 键盘输入解析算法的引用资料?

linux - 本地系统中的远程进程日志