“重新定义”已在另一个头文件中定义的宏,以控制使用它的函数的行为。
一个例子可以使事情更清楚。
/* foo.h */
#ifndef FOO_H
#define FOO_H
#ifndef MAX_LEN
#define MAX_LEN 256
#endif
void foo();
#endif
函数foo()
只打印标题
/* foo.c */
#include <stdio.h>
#include "foo.h"
void foo()
{
printf("%d", MAX_LEN);
}
当我运行以下代码时,我将获得输出256
/* main.c */
#include "foo.h"
int main()
{
foo();
return 0;
}
现在,我想要的是从MAX_LEN
内部更改main.c
,以便获得不同的结果
/* main.c */
#define MAX_LEN 16
#include "foo.h"
int main()
{
foo();
return 0;
}
输出仍是256
而不是16
?怎么会这样?
答案 0 :(得分:2)
重要的MAX_LEN
的定义是 foo.c 在编译时看到的定义。在 main.c 中定义它的方式并不重要。修改foo
内打印内容的唯一方法是在编译 foo.c 时定义MAX_LEN
。通常gcc -DMAX_LEN=16 -c foo.c
之类的东西可以胜任。
换句话说,您不能在 main.c 中影响 foo.c 编译单元。
答案 1 :(得分:1)
问题是在文件链接在一起之前预处理foo.c
文件。这意味着它已编译时MAX_LEN
设置为256
,当main.o
链接到foo.o
时,它已经编译为
void foo()
{
printf("%d", 256);
}
这是(没有#include <stdio.h>
)
gcc -E foo.c
# 1 "foo.c"
# 1 "<interno>"
# 1 "<línea-de-orden>"
# 1 "/usr/include/stdc-predef.h" 1 3 4
# 1 "<línea-de-orden>" 2
# 1 "foo.c"
# 1 "foo.h" 1
# 9 "foo.h"
void foo();
# 3 "foo.c" 2
void foo()
{
printf("%d", 256);
}
因此,当它被编译时,它被编译为原样,因为你没有包括&#34; foo.c &#34;文件&#34; main.c &#34;。