在下面的代码中,编译成功并打印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/