【发布时间】:2021-06-16 05:53:20
【问题描述】:
假设以下文件:
inner.h
#define SIZE 1
int getValue(void);
inner.c
#include "inner.h"
static int value = SIZE;
int getValue(void)
{
return value;
}
外部.h
#include "inner.h"
#ifdef SIZE
#undef SIZE
#define SIZE 2
#endif
int getValue2(void);
外部.c
#include "outer.h"
static int value2 = SIZE;
int getValue2(void)
{
return value2;
}
main.c
#include <stdio.h>
#include "inner.h"
#include "outer.h"
int main (void)
{
printf("value = %i, value2 = %i, getValue(), getValue2());
}
在编译后的代码中,会
-
value等于 1 或 2,因为inner将在outer之前编译? -
value2等于 1 还是 2? - printf 将打印什么?
【问题讨论】:
-
inner.c从不包括outer.h(直接或间接)。所以唯一相关的SIZE定义是inner.h中的定义。如果仍有任何疑问,那么只需告诉编译器生成预处理输出以获得准确值(-E选项,如果使用gcc)。 -
感谢您的回答。我已经编辑了我的问题。
-
我猜你的例子仍然不正确。您还没有显示任何包含
outer.h的代码。这意味着文件是无关紧要的。无论如何,一般规则是文件中的最后一个定义获胜。 -
main.c包含的内容无关紧要。将#define视为它出现的文件中的文本替换。所以在这种情况下,替换是在inner.c文件中完成的。而outer.c文件将出现编译错误,因为它没有SIZE的定义。我认为您可能不了解预处理、编译和链接。 -
最后一个
#define始终是适用的。所以inner.c 中的1和outer.c 中的2。
标签: c compilation include