/Zc:inline
(Odebrání neodkazovaných položek COMDAT)
Odebere neodkazovaná data nebo funkce, které jsou comDAT nebo které mají pouze interní propojení. V části /Zc:inline
kompilátor určuje, že jednotky překladu s vloženými daty nebo funkcemi musí obsahovat také jejich definice.
Syntaxe
/Zc:inline
[-
]
Poznámky
Pokud /Zc:inline
je zadán, kompilátor nevysílá informace o symbolech pro neodkazované funkce COMDAT nebo data. Nebo pro data nebo funkce, které mají pouze interní propojení. Tato optimalizace zjednodušuje práci, kterou linker dělá v buildech vydaných verzí, nebo když zadáte možnost linkeru /OPT:REF
. Tato optimalizace kompilátoru může výrazně snížit velikost souboru .obj a zlepšit rychlost linkeru. Možnost kompilátoru není povolená, když zakážete optimalizace (/Od
). Nebo když zadáte /GL
(optimalizace celého programu)
Ve výchozím nastavení je tato možnost v sestaveních příkazového řádku vypnutá (/Zc:inline-
). Tato /permissive-
možnost nepovoluje /Zc:inline
. V projektech MSBuild je tato možnost nastavena vlastností konfigurace>C/C++>Language>Remove unreferenced kód a vlastnost data, která je nastavena na Ano ve výchozím nastavení.
Pokud /Zc:inline
je zadán, kompilátor vynucuje požadavek C++11, aby všechny funkce deklarované inline
musí mít k dispozici definici ve stejné jednotce překladu, pokud se používají. Pokud není tato možnost zadaná, kompilátor Microsoftu umožňuje nevyhovující kód, který vyvolá funkce deklarované inline
i v případě, že není viditelná žádná definice. Další informace najdete ve standardu C++11 v části 3.2 a 7.1.2. Tato možnost kompilátoru byla zavedena v sadě Visual Studio 2013 Update 2.
Pokud chcete tuto možnost použít /Zc:inline
, aktualizujte nevyhovující kód.
Tento příklad ukazuje, jak nevyhovující použití deklarace vložené funkce bez definice stále kompiluje a odkazuje při použití výchozí /Zc:inline-
možnosti:
Zdrojový soubor 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() {};
};
Zdrojový soubor 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
}
Zdrojový soubor 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
}
Pokud /Zc:inline
je povolená, stejný kód způsobí chybu LNK2019 , protože kompilátor nevysílá tělo kódu, pro který není vložený Example::inline_call
example.obj
. Chybějící kód způsobí, že nedefinované volání main
odkazuje na nedefinovaný externí symbol.
Chcete-li tuto chybu vyřešit, můžete odebrat inline
klíčové slovo z deklarace Example::inline_call
, nebo přesunout definici Example::inline_call
do hlavičkového souboru nebo přesunout implementaci Example
do main.cpp
. V dalším příkladu se definice přesune do souboru záhlaví, kde je viditelná pro všechny volající, kteří záhlaví obsahují.
Zdrojový soubor 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() {};
};
Zdrojový soubor 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();
}
Zdrojový soubor 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
}
Další informace o problémech s shodami v jazyce Visual C++ naleznete v tématu Nestandardní chování.
Nastavení tohoto parametru kompilátoru ve vývojovém prostředí Visual Studio
Otevřete dialogové okno Stránky vlastností projektu. Podrobnosti najdete v tématu Nastavení kompilátoru C++ a vlastností sestavení v sadě Visual Studio.
Vyberte stránku vlastností jazyka C/C++>Vlastnosti>konfigurace.
Upravte neodkazovaný kód a vlastnost data a pak zvolte OK.