/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 、コンパイラは C++11 の要件を適用します。宣言されているすべての関数は、使用されている inline 場合は、同じ翻訳単位で使用できる定義を持つ必要があります。 このオプションが指定されていない場合、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有効にすると、同じコードによって LNK2019 エラーが発生します。これは、コンパイラがインライン化されていないコード本文をExample::inline_callexample.obj出力しないためです。 コードが見つからないと、インライン化されていない呼び出しで main 未定義の外部シンボルが参照されます。
このエラーを解決するには、宣言からキーワードをinlineExample::inline_call削除するか、ヘッダー ファイルに定義Example::inline_callを移動するか、実装を Examplemain.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] を選択します。