共用方式為


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

拿掉 COMDAT 或只有內部連結的未參考數據或函式。 在下 /Zc:inline,編譯程式指定具有內嵌數據或函式的轉譯單位也必須包含其定義。

語法

/Zc:inline[-]

備註

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

根據預設,此選項會在命令行組建中關閉 (/Zc:inline-)。 /permissive- 選項不會啟用 /Zc:inline。 在 MSBuild 專案中,選項是由組態屬性>C/C++>Language>移除未參考的程式代碼和數據屬性所設定,預設會設定為 [是]。

如果 /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 (一致性)