Nuta
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować się zalogować lub zmienić katalog.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
Usuwa niereferencyjne dane lub funkcje, które są comDATs lub które mają tylko wewnętrzne powiązania. W obszarze /Zc:inlinekompilator 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:inlineopcji . 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.objpliku . 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.