共用方式為


/Zc:inline (移除未參考的 COMDAT)

移除 COMDAT 或只有內部連結的未參考資料或函式。 在 下 /Zc:inline ,編譯器指定具有內嵌資料或函式的轉譯單位也必須包含其定義。

語法

/Zc:inline[-]

備註

指定 時 /Zc:inline ,編譯器不會針對未參考的 COMDAT 函式或資料發出符號資訊。 或者,針對只有內部連結的資料或函式。 此優化可簡化連結器在發行組建中執行的某些工作,或當您指定 /OPT:REF 連結器選項時。 此編譯器優化可以大幅減少 .obj 檔案大小,並改善連結器速度。 當您停用優化時,不會啟用編譯器選項。 /Od 或者,當您指定 /GL [神秘le 程式優化] 時。

根據預設,此選項會在命令列組建中關閉 ( /Zc:inline- )。 選項 /permissive- 未啟用 /Zc:inline 。 在 MSBuild 專案中,選項是由 組態屬性 > C/C++ > Language > Remove 未推斷的程式碼和資料 屬性所設定,預設會設定為 [是]。

如果 /Zc:inline 已指定,編譯器會強制執行 C++11 要求,宣告的所有函 inline 式都必須在相同的轉譯單位中使用定義。 未指定 選項時,Microsoft 編譯器允許不一致的程式碼叫用宣告 inline 的函式,即使沒有可見定義也一樣。 如需詳細資訊,請參閱 3.2 節和 7.1.2 節中的 C++11 標準。 此編譯器選項已引入 Visual Studio 2013 Update 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.obj 發出非內嵌程式碼主體 Example::inline_call 。 遺漏的程式碼會導致 中的 main 非內嵌呼叫參考未定義的外部符號。

若要解決此錯誤,您可以從 的 Example::inline_call 宣告中移除 inline 關鍵字,或將 的定義 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 開發環境中設定這個編譯器選項

  1. 開啟專案的 [屬性頁] 對話方塊。 如需詳細資料,請參閱在 Visual Studio 中設定 C ++ 編譯器和組建屬性

  2. 選取 [ 組態屬性 > C/C++ > 語言] 屬性頁。

  3. 修改 [移除未參考的程式碼和資料 屬性],然後選擇 [ 確定 ]。

另請參閱

/Zc (一致性)