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

残念ながら、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 に答える
1

この質問sunifdefへの回答に記載されているプログラムを調べることができます。コマンドラインでマクロ定義を指定でき、行を適切に削除します。マクロ展開はしないことに注意してください。#ifdef

#ifdefsとは言っても、このようなツールを一般的な開発に使用するべきではありませんが、何年にもわたって多くの未使用のコードで乱雑になったコードをデコードまたはクリーンアップするには非常に役立ちます。

于 2012-10-30T06:42:43.800 に答える
0

試してください:
通常はコンパイルします:gcc -include stdio.h -imacros bar.h foo.c
コンパイルして、bar.h のマクロのみを展開します:gcc -E -imacros bar.h foo.c

于 2012-10-30T07:12:41.363 に答える
0

Eclipseのような IDE を使用できます。コンパイルされていないコードの部分を無効にします。見たいものを「正確に」見ることはできないかもしれませんが、無効化されたコードと通常のコードの明確な違いを見ることができます。GUI を使用する余裕がない場合は、このオプションを無視してください。

Eclipse は、複雑なマクロがある場合に非常に便利なマクロの展開にも役立ちます。

于 2012-10-30T06:29:00.530 に答える