/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_callexample.obj出力しないためです。 コードが見つからないと、インラインでない呼び出しで未定義の main 外部シンボルが参照されます。

このエラーを解決するには、キーワード (keyword)をinline宣言から削除するか、ヘッダー ファイルに定義Example::inline_callを移動するか、または実装を Examplemain.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 開発環境でこのコンパイラ オプションを設定するには

  1. プロジェクトの [プロパティ ページ] ダイアログ ボックスを開きます。 詳細については、Visual Studio での C++ コンパイラとビルド プロパティの設定に関する記事を参照してください。

  2. [構成プロパティ]>[C/C++]>[言語] プロパティ ページを選択します。

  3. [参照されていないコードとデータの削除] プロパティを変更し、[OK] を選択します。

関連項目

/Zc (準拠)