/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
移至頭檔,或將 的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++]>[語言] 屬性頁。
修改 [移除未參考的程式代碼和數據屬性],然後選擇 [確定]。