14

ほとんどの場合、C でオプション機能を作成したい場合、次のような 2 つの関数を作成するだけです。

#ifdef OPTIONAL_SOMETHING
void do_something(int n, const char *s)
{
    while (n--) {
        printf("%s", s);
    }

    /* ...You might get the point, really do something... */
}
#else
void do_something(int n, const char *s)
{
    /* Empty body */
}
#endif

そのため、シンボルが未定義の場合 (機能が無効になっている場合)、空の関数が実行可能ファイルにコンパイルされます。

アセンブリ リストを調べてみると、最適化が無効になっている場合、GCC は空の関数をコンパイルして呼び出すようです。最適化が有効になっている場合、およびも使用すると、必要なスタック処理コードのみがコンパイルされますが、呼び出し命令は最適化されません。全体として、機能を維持します。-O2-O3

空ではないが未使用のメソッドにもほぼ同じことが当てはまります。

単純にすべてを捨てる必要がありますが、そうではありません。なぜそれがデフォルトの動作なのですか? 好奇心のために: どうすればこれを排除できますか?

4

2 に答える 2

27

関数には外部リンケージがある (ではないstatic) ため、別のオブジェクト ファイルが参照する可能性があるため、コンパイラはそれを削除できません。機能が の場合、static完全に削除されます。

于 2012-04-06T22:32:58.243 に答える
1

コンパイラに最終的に関数をインライン化させたい場合は、彼に伝えなければなりません。function を宣言しますinline。これにより、コンパイラーは、適合すると判断した場合に関数を発行しないようになります。

これにより、-O0 などを指定してコンパイルすると、「未定義のシンボル」エラーが発生する可能性があります。のような「インスタンス化」を入れます

void do_something(int n, const char *s);

1 つのコンパイル ユニット (.c ファイル) で。

于 2012-04-07T03:46:11.883 に答える