1

質問はとても簡単です。このコードをコンパイルしてリンクするとしましょう:

static char const *foo() { static char const *baz = "0123456789ABCDEF"; return baz; }
static char const *(*bar)() = foo;
int main() { return 0; }

Visual C++ コンパイラまたはリンカは、文字列が使用済みとして自動的にマークされ、使用されていないことは明らかですが (アドレスが baz使用されているにもかかわらず)、文字列を含めます。foo

実際に使用されていないこのようなコードをコンパイラまたはリンカーに含めないようにする方法はありますか?

4

2 に答える 2

0

コンパイラが未使用のシンボルを削除する機会は (あるとしても) 限られています。各ソース ファイルは、定義されているすべてのものが他の場所でコンパイルされたコードによって参照される可能性があるという前提で、obj ファイルにコンパイルされます。リンカーは、渡されたすべてのライブラリとオブジェクト ファイルから未使用のシンボルを最適化する義務を負います。また、リンカーが個々の .obj 入力の一部だけを無視することは困難ですが、不可能ではありません。

これで十分かもしれません:

  1. mainそれ自身のソース ファイルに移動し、main.c参照に何もないようにしますfoo

  2. リリース ビルドに切り替えます。/OPT:REFがリンカー最適化オプションとして設定されていることを確認してください。

  3. 「ビルド クリーン」を実行してから、アプリ全体のフル ビルドを実行します。

于 2016-11-05T22:50:09.640 に答える