1

大規模なレガシー コード ベースの作業を始めたところです。プレーンテキストの「定義ファイル」で名前が付けられた多くの変数と構造があります。次に、いくつかのヘッダー ファイルがこれらの定義ファイルをインクルードし、Cプリプロセッサを使用して変数宣言と getter/setter を生成します。

これは、フィールドの作業と変更に大きな苦痛をもたらします。また、getter/setter の署名はコンパイル時まで生成されないため、それらに対する Intellisense サポートもありません。

コンパイル時間の前にコードを生成し、プリプロセッサ ベースのヘッダーを含めるのではなく、生成されたヘッダー ファイルを含めるように他のモジュールに依頼することを考えています。Python + clang を調べて、キーワードをC言語に追加しました。しかし、どちらも圧倒されてしまい、どうやって始めればいいのかわかりません。そこで、人々が問題に対処するために推奨する方法についてお聞きしたいと思います。

編集:コードベースは私に属していないため、コピーして貼り付けることはできません. しかし、私はコードを模倣することができ、それは次のようになります:

// in the definition file
NEWVARIABLE( point, int )

// in the preprocessor header file
#define NEWVARIABLE( name, type ) \
static type name;\
type LIBNAME_Get##name##(){return name ; }\
void LIBNAME_Set##name##( type _##name ){ name = _##name ; }

場合によっては、これらのプリプロセッサによって生成された関数またはデータが関数ポインタとインターリーブし、さらにおかしくなります。

4

5 に答える 5

2

おそらく、プリコンパイラを (gcc -Eたとえば GCC コンパイラを使用して) 実行し、結果のテキストを切り取って保存することができます。あまり良くはありませんが、自動的に改善するのは難しいでしょう。

于 2012-08-10T06:37:49.960 に答える
1

GCC を使用している場合はgcc -save-temps Code.c、前処理されたファイルが Code.i として生成され、すべてのマクロがここで置き換えられます。(何が欲しいかは不明)

于 2012-08-10T06:40:07.720 に答える
0

私の理解では、標準の C イディオム (ちなみに、定義ファイルがマクロの他の定義と共に別の場所に含まれていても驚かないでしょう) を、ビルド プロセスに依存関係を追加する別のものに置き換えたいということです。まだ存在しません。

私はそれをしません。それは壊れていたり悪いものではありません。テクニックに慣れていないのはあなただけです。

大規模なレガシー コードの私の経験が当てはまる場合、間違いなく壊れているものを改善する機会がたくさんあるはずです。それらに取り組みます。

于 2012-08-11T07:44:15.277 に答える
0

コンパイル時に関数名を生成する明確な必要性はありません。プログラムから実際に呼び出された関数のみが実行可能ファイルにリンクされます。したがって、それらのマクロが何らかの目的を満たしているかどうか自問してから、考えられるすべての関数の組み合わせに置き換えることを検討する必要があります。(プログラムのパフォーマンスが重要な場合は、おそらく関数をインライン化します。)

しかし、プログラムのサイズと複雑さによっては、既存のプログラムに大幅な変更を加えるのはよくありません。

これよりも詳細な回答については、コードを投稿する必要があります。

于 2012-08-10T06:42:37.867 に答える
0

関心のある範囲に商用ソリューションが含まれる場合は、当社の Web サイトhttp://www.cdsan.comをチェックすることをお勧めします。カスタム リファクタリングとコンバーターを提供します。妥当な努力をすれば、ファイルを変換できるようです。

于 2012-08-11T07:10:25.397 に答える