2017-08-20 10 views
1

私の作業ディレクトリのCファイルのインクルード指示を展開したいと思います。システムディレクトリではありません。特定の作業ディレクトリでCファイルを部分的に前処理する方法

私は次のことを試してみました:

gcc -E -nostdinc -I./ input.c 

をしかし、それはinput.cに含まれるシステムヘッダを見つけるために失敗した場合には、前処理を停止します。インクルード・ディレクティブが見つからないときにインクルード・ディレクティブをコピーし、ファイルを前処理しておきたい。

+0

は解決策をい[どのように私は地元のヘッダーにプリプロセッサを実行しますか?](https://stackoverflow.com/questions/20889460 /)ヘルプ?これはC++の質問に対する答えですが、アイデア(とスクリプト)もCのコードで直接動作します。 –

+0

空のファイルなどを作成する必要がないので、私自身のソリューション[https://stackoverflow.com/a/45786694/7392560]ははるかに簡単です。 –

+0

マシンにHaskellがインストールされている場合は、あるいは予めビルドされたコピーを見つけたら、 'cpphs'を使うほうが良いでしょう。 –

答えて

1

私は私が探していたまさにんutilityが見つかりました:

$ cpphs --nowarn --nomacro -I./ input.c | sed -E 's|#line 1 "missing file: (.*)"|#include <\1>|' 
1

input.cファイルにシステムヘッダが含まれていると、プリプロセッサが見つからない場合にクラッシュするのが普通です。

最初(リストは非網羅的である)このような何かを達成し、あなたのコード内のシステムヘッダのすべて#includeを削除するためにgrep -vを使用することができます。

grep -vE "(stdio|stdlib)\.h" code.c > code_.c 

あなたはインスタンスの取得:

#define EXITCODE 0 
int main(){ 
    int i = EOF; 
    printf("hello\n"); 
    return EXITCODE; 
} 

次に前処理:

S:\c>gcc -E code_.c 
# 1 "code_.c" 
# 1 "<built-in>" 
# 1 "<command-line>" 
# 1 "code_.c" 

int main(){ 
    int i = EOF; 
    printf("hello\n"); 
    return 0; 
} 

注意してください。プロセッサは定義されていない関数やマクロを気にしません。あなたはコードを前処理してしまいます(マクロも展開されます)。

もちろん、すべてのファイルを処理する必要があります。つまり、一時的なソースファイルを作成してそこから作業する余分なレイヤーのツールを意味します。

+0

もちろん、ありがとう! –

関連する問題