/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
有効にすると、同じコードでLNK2019 エラーが発生します。これは、コンパイラがインラインでないコード本文をExample::inline_call
example.obj
出力しないためです。 コードが見つからないと、インラインでない呼び出しで未定義の main
外部シンボルが参照されます。
このエラーを解決するには、キーワード (keyword)をinline
宣言から削除するか、ヘッダー ファイルに定義Example::inline_call
を移動するか、または実装を Example
main.cpp
.Example::inline_call
次の例では、定義をヘッダー ファイルに移動します。このファイルは、ヘッダーを含む呼び出し元に表示されます。
ソース ファイル 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] を選択します。
関連項目
フィードバック
https://aka.ms/ContentUserFeedback」を参照してください。
以下は間もなく提供いたします。2024 年を通じて、コンテンツのフィードバック メカニズムとして GitHub の issue を段階的に廃止し、新しいフィードバック システムに置き換えます。 詳細については、「フィードバックの送信と表示