/Zc:inline
(参照されていない COMDAT の削除)
COMDAT であるか内部リンケージのみを持つ、参照されていないデータまたは関数を削除します。 /Zc:inline
では、コンパイラは、インライン データまたは関数を含む翻訳単位に定義も含める必要があることを指定します。
構文
/Zc:inline
[-
]
解説
/Zc:inline
を指定すると、コンパイラは、参照されていない COMDAT 関数またはデータのシンボル情報を出力しません。 内部リンケージのみを持つデータまたは関数の場合も同様です。 この最適化により、リンカーがリリース ビルドで行う作業や、 /OPT:REF
リンカー オプションを指定する場合の作業の一部が簡略化されます。 このコンパイラの最適化により、.obj ファイル サイズを大幅に削減し、リンカーの速度を向上させることができます。 最適化 (/Od
) を無効にすると、コンパイラ オプションは有効になりません。 または、 /GL
(プログラム全体の最適化) を指定する場合。
既定では、このオプションはコマンド ライン ビルドではオフ (/Zc:inline-
) です。 /permissive-
オプションでは、/Zc:inline
は有効になりません。 MSBuild プロジェクトでは、このオプションは [構成プロパティ]>[C/C++]>[言語]>[参照されていないコードとデータの削除] プロパティで設定されます。このプロパティは、既定では [はい] に設定されています。
/Zc:inline
が指定されている場合、コンパイラは、inline
宣言されているすべての関数が、使用されている場合は同じ翻訳単位で使用可能な定義を持つ必要があることを C++11 要件に適用します。 このオプションが指定されていない場合、Microsoft コンパイラは、定義が表示されない場合でも、 inline
宣言された関数を呼び出す非準拠コードを許可します。 詳細については、C++11 標準のセクション 3.2 およびセクション 7.1.2 を参照してください。 このコンパイラ オプションは、Visual Studio 2013 更新プログラム 2 で導入されました。
/Zc:inline
オプションを使用するには、準拠していないコードを更新します。
この例では、既定の /Zc:inline-
オプションが使用されている場合に、定義のないインライン関数宣言の準拠していない使用がコンパイルされ、リンクされる方法を示します。
ソース ファイル example.h
:
// example.h
// Compile by using: cl /W4 /EHsc /O2 zcinline.cpp example.cpp
#pragma once
class Example {
public:
inline void inline_call(); // declared but not defined inline
void normal_call();
Example() {};
};
ソース ファイル example.cpp
:
// example.cpp
// Compile by using: cl /W4 /EHsc /O2 zcinline.cpp example.cpp
#include <stdio.h>
#include "example.h"
void Example::inline_call() {
printf("inline_call was called.\n");
}
void Example::normal_call() {
printf("normal_call was called.\n");
inline_call(); // with /Zc:inline-, inline_call forced into .obj file
}
ソース ファイル zcinline.cpp
:
// zcinline.cpp
// Compile by using: cl /W4 /EHsc /O2 zcinline.cpp example.cpp
#include "example.h"
int main() {
Example example;
example.inline_call(); // normal call when definition unavailable
}
/Zc:inline
が有効になっている場合、コンパイラはexample.obj
のExample::inline_call
に対してインライン化されていないコード本文を出力しないため、同じコードでLNK2019 エラーが発生します。 コードが見つからないと、 main
の非インライン呼び出しで未定義の外部シンボルが参照されます。
このエラーを解決するには、Example::inline_call
の宣言から inline
キーワードを削除するか、Example::inline_call
の定義をヘッダー ファイルに移動するか、Example
の実装をmain.cpp
に移動します。 次の例では、定義をヘッダー ファイルに移動します。このファイルは、ヘッダーを含む呼び出し元に表示されます。
ソース ファイル example2.h
:
// example2.h
// Compile by using: cl /W4 /EHsc /O2 zcinline2.cpp example2.cpp
#pragma once
#include <stdio.h>
class Example2 {
public:
inline void inline_call() {
printf("inline_call was called.\n");
}
void normal_call();
Example2() {};
};
ソース ファイル example2.cpp
:
// example2.cpp
// Compile by using: cl /W4 /EHsc /O2 zcinline2.cpp example2.cpp
#include "example2.h"
void Example2::normal_call() {
printf("normal_call was called.\n");
inline_call();
}
ソース ファイル zcinline2.h
:
// zcinline2.cpp
// Compile by using: cl /W4 /EHsc /O2 zcinline2.cpp example2.cpp
#include "example2.h"
int main() {
Example2 example2;
example2.inline_call(); // normal call when definition unavailable
}
Visual C++ の準拠に関する問題の詳細については、「 非標準動作」を参照してください。
Visual Studio 開発環境でこのコンパイラ オプションを設定するには
プロジェクトの [プロパティ ページ] ダイアログ ボックスを開きます。 詳細については、Visual Studio での C++ コンパイラとビルド プロパティの設定に関する記事を参照してください。
[構成プロパティ]>[C/C++]>[言語] プロパティ ページを選択します。
[参照されていないコードとデータの削除] プロパティを変更し、[OK] を選択します。