/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 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.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 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 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).
Wählen Sie die Konfigurationseigenschaftenseite>C/C++>-Sprache aus.
Ändern Sie den nicht referenzierten Code und die Dateneigenschaft entfernen, und wählen Sie dann "OK" aus.
Siehe auch
Feedback
https://aka.ms/ContentUserFeedback.
Bald verfügbar: Im Laufe des Jahres 2024 werden wir GitHub-Issues stufenweise als Feedbackmechanismus für Inhalte abbauen und durch ein neues Feedbacksystem ersetzen. Weitere Informationen finden Sie unterFeedback senden und anzeigen für