/Zc:inline (Entfernen nicht referenzierter COMDAT-Elemente)

Entfernt nicht referenzierte Daten oder Funktionen, die COMDATs sind oder nur über interne Verknüpfungen verfügen. Unter /Zc:inlinedem Compiler wird angegeben, dass Übersetzungseinheiten mit Inlinedaten oder -funktionen auch ihre Definitionen enthalten müssen.

Syntax

/Zc:inline[-]

Hinweise

Wenn /Zc:inline angegeben, gibt der Compiler keine Symbolinformationen für nicht referenzierte COMDAT-Funktionen oder -Daten aus. Oder für Daten oder Funktionen, die nur über interne Verknüpfungen verfügen. Diese Optimierung vereinfacht einige der Aufgaben, die der Linker in Releasebuilds ausführt, oder wenn Sie die /OPT:REF Linkeroption angeben. Diese Compileroptimierung kann die GRÖßE der OBJ-Datei erheblich reduzieren und die Linkergeschwindigkeit verbessern. Die Compileroption ist nicht aktiviert, wenn Sie Optimierungen deaktivieren (/Od). Oder wenn Sie (Wer le Programmoptimierung) angeben /GL .

Standardmäßig ist diese Option in Befehlszeilenbuilds deaktiviert (/Zc:inline-). Die /permissive- Option ist nicht aktiviert /Zc:inline. In MSBuild-Projekten wird die Option durch die Konfigurationseigenschaften>C/C++>Language>Remove unreferenced code and data property festgelegt, die standardmäßig auf "Ja" festgelegt ist.

Wenn /Zc:inline angegeben, erzwingt der Compiler die C++11-Anforderung, dass alle deklarierten inline Funktionen eine Definition in derselben Übersetzungseinheit zur Verfügung haben müssen, wenn sie verwendet werden. Wenn die Option nicht angegeben ist, lässt der Microsoft-Compiler nicht konformen Code zu, der Funktionen aufruft, die deklariert inline werden, auch wenn keine Definition sichtbar ist. Weitere Informationen finden Sie unter „C++11-Standard“ in den Abschnitten 3.2 und 7.1.2. Diese Compileroption wurde in Visual Studio 2013 Update 2 eingeführt.

Aktualisieren Sie nicht konformen Code, um die /Zc:inline Option zu verwenden.

In diesem Beispiel wird gezeigt, wie die nicht konforme Verwendung einer Inlinefunktionsdeklaration ohne Definition immer noch kompiliert und verknüpft wird, wenn die Standardoption /Zc:inline- verwendet wird:

Quelldatei 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() {};
};

Quelldatei 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
}

Quelldatei 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
}

Wenn /Zc:inline dieser Code aktiviert ist, verursacht derselbe Code einen LNK2019 Fehler, da der Compiler keinen nicht inlineierten Codetext für Example::inline_call inline example.objausgibt. Der fehlende Code bewirkt, dass der nicht inlineierte Aufruf main auf ein nicht definiertes externes Symbol verweist.

Um diesen Fehler zu beheben, können Sie die inline Schlüsselwort (keyword) aus der Deklaration von Example::inline_call, oder verschieben Sie die Definition in Example::inline_call die Headerdatei, oder verschieben Sie die Implementierung in Examplemain.cpp. Im nächsten Beispiel wird die Definition in die Headerdatei verschoben, wo sie für jeden Aufrufer sichtbar ist, der den Header enthält.

Quelldatei 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() {};
};

Quelldatei 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();
}

Quelldatei 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
}

Weitere Informationen zu Konformitätsproblemen in Visual C++ finden Sie unter "Nicht standardmäßiges Verhalten".

So legen Sie diese Compileroption in der Visual Studio-Entwicklungsumgebung fest

  1. Öffnen Sie das Dialogfeld Eigenschaftenseiten des Projekts. Weitere Informationen erhalten Sie unter Set C++ compiler and build properties in Visual Studio (Festlegen der Compiler- und Buildeigenschaften (C++) in Visual Studio).

  2. Wählen Sie die Konfigurationseigenschaftenseite>C/C++>-Sprache aus.

  3. Ändern Sie den nicht referenzierten Code und die Dateneigenschaft entfernen, und wählen Sie dann "OK" aus.

Siehe auch

/Zc (Konformität)