関数があるとします
void do_something() {
//....
#ifdef FEATURE_X
feature_x();
#endif
//....
}
これを問題なくコンパイルして実行できます。機能が必要な場合は、渡すことができ、機能-D FEATURE_X
します。
ただし、別のファイルに入れたい場合はどうでしょうかdo_something
(オプションを変更するたびにそのファイルを再コンパイルする必要はありません)。それが同じファイルにあった場合、私はそれを推測します
const int FEATURE_X=0;
void do_something() {
//....
if(FEATURE_X) {
feature_x();
}
//....
}
デッドコードの削除を適切に使用して、呼び出しを削除します。これをLTOなしで別のファイルに入れると、
extern const int FEATURE_X;
void do_something() {
//....
if(FEATURE_X) {
feature_x();
}
//....
}
コードは削除されません (知る方法がありません)。では、リンク時の最適化を有効にすると、コンパイラはFEATURE_X
リンク時の値を検出し、コードが使用されているかどうかを判断し、必要に応じて削除できますか?