/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:inline
dem 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 .obj Dateigröße erheblich reduzieren und die Geschwindigkeiten der Linker verbessern. Die Compileroption ist nicht aktiviert, wenn Sie Optimierungen deaktivieren (/Od
). Oder, wenn Sie (Gesamte Programmoptimierung) angeben /GL
.
Standardmäßig ist diese Option in Befehlszeilenbuilds deaktiviert (/Zc:inline-
). Die Option /permissive-
aktiviert /Zc:inline
nicht. 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.obj
ausgibt. 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 das inline
Schlüsselwort aus der Deklaration von Example::inline_call
, oder verschieben Sie die Definition in Example::inline_call
die Headerdatei, oder verschieben Sie die Implementierung in Example
main.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
Ö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).
Navigieren Sie zur Eigenschaftenseite Konfigurationseigenschaften>C/C++>Sprache.
Ändern Sie den nicht referenzierten Code und die Dateneigenschaft entfernen, und wählen Sie dann "OK" aus.