0

関数定義を含む C ファイルがあります。

#ifdef SOMEFEATURE
    myfunction_withfeature()
#else
    myfunction_withoutfeature()
#endif
{
    do_something;

    #ifdef SOMEFEATURE
        do_one_way;
    #else
        do_another_way;
    #endif

    do_something_else;
}

ヘッダーまたは Makefile で SOMEFEATURE を定義すると、1 つのバージョンが取得されます。そうでない場合は、別のバージョンが取得されます。必要なのは 2 つのバージョンです。コードをコピーして貼り付け、シンボルを定義/定義解除できることは理解していますが、それは面倒です。コードを複製せずに両方の関数を定義する方法はありますか?

4

5 に答える 5

1

さて、次のようにコードを 2 回コンパイルできます。

cc -DSOMEFEATURE x.c -o x1.o
cc -x.c -o x2.o

それらのオブジェクトファイルをリンクします。「2つのバージョン」を持たない他の関数が複製され、リンカーがそれを気に入らないことを確認する必要があることに注意してください。したがって、それらの周りに ifdef を配置するか、ファイルに「ifdef SOMEFEATURE」を含む関数のみが含まれていることを確認する必要があります。

一般的に、これは悪い設計上の決定であり、可能であれば避けるべきだと思います。

于 2013-11-07T17:02:34.780 に答える
0

あなたは出来る:

  • 共通コードをサブルーチン (関数) に移動します。

  • 引数としてフラグを渡します。例:

    myfunction_withfeature() { myfunction_common(true); }

于 2013-11-07T17:38:06.217 に答える
0

私の意見では、@ Thomas Padron-McCarthには、プリプロセッサを使用したいだけの場合に対処する正しい方法があります。複雑すぎる場合は、別の種類のテンプレート システムまたはコード生成システムに切り替える必要があります。私は個人的に、C または C++ コードを吐き出す perl スクリプトを使用してきました。次に、Python を使用してその場でコードのセクションを置き換えるCogがあります。

于 2013-11-07T17:36:22.270 に答える