ほとんどの場合、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
空ではないが未使用のメソッドにもほぼ同じことが当てはまります。
単純にすべてを捨てる必要がありますが、そうではありません。なぜそれがデフォルトの動作なのですか? 好奇心のために: どうすればこれを排除できますか?