/Zc:inline
(Usuń niereferencję COMDAT)
Usuwa niereferencyjne dane lub funkcje, które są comDATs lub które mają tylko wewnętrzne powiązania. W obszarze /Zc:inline
kompilator określa, że jednostki tłumaczenia z wbudowanymi danymi lub funkcjami muszą również zawierać ich definicje.
Składnia
/Zc:inline
[-
]
Uwagi
Po /Zc:inline
określeniu kompilator nie emituje informacji o symbolach dla nieużywanych funkcji ani danych COMDAT. Lub w przypadku danych lub funkcji, które mają tylko połączenie wewnętrzne. Ta optymalizacja upraszcza niektóre działania konsolidatora wykonywane w kompilacjach wydania lub po określeniu opcji konsolidatora /OPT:REF
. Ta optymalizacja kompilatora może znacznie zmniejszyć .obj rozmiar pliku i zwiększyć szybkość konsolidatora. Opcja kompilatora nie jest włączona podczas wyłączania optymalizacji (/Od
). Lub po określeniu /GL
(Optymalizacja całego programu).
Domyślnie ta opcja jest wyłączona (/Zc:inline-
) w kompilacjach wiersza polecenia. Opcja /permissive-
nie włącza /Zc:inline
opcji . W projektach MSBuild opcja jest ustawiana przez właściwości>konfiguracji C/C++>Language>Remove unreferenced code and data property , która jest domyślnie ustawiona na Wartość Tak.
Jeśli /Zc:inline
zostanie określony, kompilator wymusza wymaganie języka C++11, że wszystkie zadeklarowane inline
funkcje muszą mieć definicję dostępną w tej samej jednostce tłumaczenia, jeśli są używane. Jeśli opcja nie zostanie określona, kompilator firmy Microsoft zezwala na niezgodny kod, który wywołuje funkcje zadeklarowane inline
, nawet jeśli żadna definicja nie jest widoczna. Aby uzyskać więcej informacji, zobacz standard C++11 w sekcji 3.2 i sekcji 7.1.2. Ta opcja kompilatora została wprowadzona w programie Visual Studio 2013 Update 2.
Aby użyć /Zc:inline
tej opcji, zaktualizuj niezgodny kod.
W tym przykładzie pokazano, jak niezgodne użycie deklaracji funkcji wbudowanej bez definicji nadal kompiluje i łączy, gdy jest używana opcja domyślna /Zc:inline-
:
Plik example.h
źródłowy:
// 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() {};
};
Plik example.cpp
źródłowy:
// 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
}
Plik zcinline.cpp
źródłowy:
// 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
}
Po /Zc:inline
włączeniu ten sam kod powoduje błąd LNK2019 , ponieważ kompilator nie emituje treści kodu innego niż Example::inline_call
w example.obj
pliku . Brakujący kod powoduje niezdefiniowane wywołanie w obiekcie w main
celu odwołania się do niezdefiniowanego symbolu zewnętrznego.
Aby rozwiązać ten błąd, możesz usunąć inline
słowo kluczowe z deklaracji Example::inline_call
, lub przenieść definicję Example::inline_call
do pliku nagłówka lub przenieść implementację Example
do main.cpp
. Następny przykład przenosi definicję do pliku nagłówka, gdzie jest widoczny dla dowolnego wywołującego, który zawiera nagłówek.
Plik example2.h
źródłowy:
// 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() {};
};
Plik example2.cpp
źródłowy:
// 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();
}
Plik zcinline2.h
źródłowy:
// 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
}
Aby uzyskać więcej informacji na temat problemów ze zgodnością w programie Visual C++, zobacz Zachowanie niezgodne.
Aby ustawić tę opcję kompilatora w środowisku programowania Visual Studio
Otwórz okno dialogowe Strony właściwości projektu. Aby uzyskać szczegółowe informacje, zobacz Set C++ compiler and build properties in Visual Studio (Ustawianie właściwości kompilatora języka C++ i kompilowania w programie Visual Studio).
Wybierz stronę właściwości Właściwości>konfiguracji C/C++>Language.
Zmodyfikuj właściwość Usuń nieużywany kod i dane , a następnie wybierz przycisk OK.