1

我有一个源文件foo.c和一个头文件bar.h。我怎样才能macrosbar.h中展开而不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 的源文件中扩展所有(并且仅)这些宏。有什么建议么?

4

4 回答 4

1

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

也就是说,您不应该将这样的工具用于一般开发,但它对于解码或清理多年来与许多未使用#ifdefs的 's 混淆的代码非常有用。

于 2012-10-30T06:42:43.800 回答
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
于 2012-10-30T07:00:07.733 回答
0

您可以使用Eclipse之类的 IDE 。它禁用未编译的代码部分。您可能无法“准确”看到您想看到的内容,但您可以看到禁用代码和正常代码之间的明显区别。如果您不喜欢使用 GUI,请忽略此选项。

Eclipse 还有助于扩展宏,这在您有复杂的宏时非常方便。

于 2012-10-30T06:29:00.530 回答
0

尝试:
正常编译:gcc -include stdio.h -imacros bar.h foo.c
编译以仅扩展 bar.h 中的 MACROS:gcc -E -imacros bar.h foo.c

于 2012-10-30T07:12:41.363 回答