【发布时间】:2018-01-23 12:21:21
【问题描述】:
我有三个文件
文件“grandparent.h”
#ifndef GRANDPARENT_H
#define GRANDPARENT_H
struct foo {
int member;
};
#endif /* GRANDPARENT_H */
文件“parent.h”
#include "grandparent.h"
文件“child.c”
#include "grandparent.h"
#include "parent.h"
维基说
这里,“grandparent.h”的第一个包含导致宏 GRANDPARENT_H 被定义。然后,当“child.c”包含 “grandparent.h”第二次,#ifndef 测试返回 false,并且 预处理器跳到#endif,从而避免了第二个 struct foo 的定义。程序编译正确。
q1。 “第一次包含“grandparent.h”会导致 宏
GRANDPARENT_H 要定义”,所以我理解它基本上是定义一个名为GRANDPARENT_H的宏,但我不明白的是该宏的内容将如何(即GRANDPARENT_H) 将包含在 child.c 中。
我们只是定义宏 GRANDPARENT_H 即
#define GRANDPARENT_H
struct foo {
int member;
};
但它的内容将如何,即
struct foo {
int member;
};
被包含在child.c中
【问题讨论】:
-
它没有价值。它只是为了确保类型和函数定义只被编译器评估一次而定义。
-
@Jean-FrançoisFabre 你的意思是宏 GRANDPARENT_H 是空的
-
只需运行
gcc -E以在预处理器完成其工作后获取代码,如果不是 gcc,请检查您正在使用的编译器的文档。 Clang 使用了相同的-E标志(clang.llvm.org/docs/CommandGuide/clang.html) -
@rimiro 你可以写
#define FOO 123。然后定义了预处理器符号FOO,每次写FOO,FOO都会被123替换。但你也可以写#define FOO。然后预处理符号FOO也被定义了,每次你写FOO时,FOO都会被替换成一个空字符串。 -
宏的内容只是它所在行之外的内容,而不是文件内容。
标签: c macros c-preprocessor ifndef