4

単一のヘッダー ファイルの #define エントリのみを使用するようにテキスト処理を制限しながら、clang (または gcc) プリプロセッサを使用してコード ベースを前処理するにはどうすればよいですか?

これは一般的に便利です: 現在取り組んでいるいくつかのマクロの即時結果をプレビューしたいと想像してみてください... C に固有のインクルードの山から生じるすべての混乱を避けることができます.

機能の可用性に基づいて、下位互換性のある呼び出しまたは最新の呼び出しを生成するマクロがある場合を想像してみてください。

#if __has_feature(XYZ)
#   define JX_FOO(_o) new_foo(_o)
#   define JX_BAR(_o) // nop
...
#else
#   define JX_FOO(_o) old_foo(_o)
#   define JX_BAR(_o) old_bar(_o)
...
#endif

具体的な例は、マクロのコレクションを使用して手動メモリ管理 (非 ARC) から ARC 互換 (自動参照カウント) に移植された Objective-C コードのコレクションです ( https://github.com/JanX2/google -diff-match-patch-Objective-C/blob/master/JXArcCompatibilityMacros.h ) を使用して、後で両方の方法でコンパイルします。

ある時点で、非 ARC サポートをドロップして、読みやすさと保守性を向上させたいと思うでしょう。

編集: プリプロセッサ出力を取得するための基礎は、ここで説明されています: C、Objective-C プリプロセッサ出力

編集 2: Xcode でソースからソースへの変換オプションがどのように実装されているか ([編集] > [リファクタリング] > [変換…]) の詳細を誰かが持っている場合、それは役立つかもしれません。

4

3 に答える 3

0

これは、sed/awk に最適なケースです。ただし、あなたが言及した正確なユースケースに利用できるさらに優れたツールが存在します。チェックアウトコイン.

<SYMBOL>シンボルが定義されているかのようにソース ファイルを前処理するには、

$ coan source -D<SYMBOL> sourcefile.c

同様に、シンボル<SYMBOL>が定義されていないかのようにソース ファイルを前処理するには、

$ coan source -U<SYMBOL> source.c
于 2013-08-06T10:25:16.670 に答える
0

これは少しばかげた解決策ですが、機能します。AppCode のリファクタリングを使用して、マクロの使用を削除できるようです。

ただし、これはソリューションを OS X に限定します。また、すべてのJX_FOO()およびに対して手動でこれを行う必要があるため、少し面倒ですJX_BAR()

于 2014-03-06T10:38:46.890 に答える