/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
移至標頭檔,或將 的 Example
main.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++ > 語言] 屬性頁。
修改 [移除未參考的程式碼和資料 屬性],然後選擇 [ 確定 ]。
另請參閱
意見反映
https://aka.ms/ContentUserFeedback。
即將推出:我們會在 2024 年淘汰 GitHub 問題,並以全新的意見反應系統取代並作為內容意見反應的渠道。 如需更多資訊,請參閱:提交及檢視以下的意見反映: