根据指定的头文件在C中扩展宏

时间:2012-10-30 06:17:26

标签: c macros c-preprocessor

我有一个源文件 foo.c 和一个头文件 bar.h 。如何在 bar.h 中展开macros而不在其他标头文件中展开macros

$ cat foo.c

#include <stdio.h>
#include "bar.h"

int main()
{
#ifdef BAR_FUNC
    printf("bar func\n");
#else
    printf("foo func\n");
#endif
    return 0;
}

$ cat bar.h

#define BAR_FUNC 1

我想要的是:

$ EXPAND_MAGIC foo.c

#include <stdio.h>

int main()
{
    printf("bar func\n");
    return 0;
}

如果我使用`gcc -E,它也会扩展<stdio.h>。但我只是想在 bar.h 中扩展宏。 gcc中有没有选项呢?如果没有,还有其他工具可以进行这样的预处理吗?

更新: foo.c / bar.h 上面只是一个例子。实际上,我在bar.h中定义了几百个宏(请考虑在一个相当大的项目中由autoconf生成的config.h)。我想要的是在超过10K的源文件中扩展所有(和 ONLY )这些宏。有什么建议吗?

4 个答案:

答案 0 :(得分:1)

您可以查看this question答案中提到的程序sunifdef。它允许您在命令行上指定宏定义,并适当地消除#ifdef行。请注意,它不会进行宏扩展。

也就是说,您不应该使用这样的工具进行一般开发,但它对于解码或清理许多未使用的#ifdefs&#的混乱代码非常有用39岁以上。

答案 1 :(得分:1)

不幸的是,proeprocessos是全有或全无。您运行它并包含所有请求的文件并展开所有宏。

但是,您可以通过使用预处理器的条件编译功能来解决它​​:

#ifndef INCLUDE_ONLY_BAR
# include <stdio.h>
#endif
#include "bar.h"

int main()
{
#ifdef BAR_FUNC
    printf("bar func\n");
#else
    printf("foo func\n");
#endif
    return 0;
}

你可以“编译”它:

$ gcc -E -DINCLUDE_ONLY_BAR foo.c

答案 2 :(得分:0)

您可以使用eclipse之类的IDE。它禁用未编译的代码部分。您可能无法“完全”看到您想要查看的内容,但您可以看到禁用代码和普通代码之间的明显区别。如果您没有使用GUI,请忽略此选项。

Eclipse在expanding macros中也有帮助,当你有复杂的宏时,它会非常方便。

答案 3 :(得分:0)

尝试:
通常编译:{{1​​}}
编译为仅在bar.h中展开MACROS:gcc -include stdio.h -imacros bar.h foo.c