从其定义文件外部重新定义宏

时间:2015-12-03 02:10:07

标签: c macros

“重新定义”已在另一个头文件中定义的宏,以控制使用它的函数的行为。

一个例子可以使事情更清楚。

/* 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?怎么会这样?

Also read

2 个答案:

答案 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;。