我有一个源文件 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 )这些宏。有什么建议吗?
答案 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