Udostępnij za pośrednictwem


/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: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

  1. 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).

  2. Wybierz stronę właściwości Właściwości>konfiguracji C/C++>Language.

  3. Zmodyfikuj właściwość Usuń nieużywany kod i dane , a następnie wybierz przycisk OK.

Zobacz też

/Zc (Zgodność)