Share via


/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:inlinekompilá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 (Kdo le Optimalizace 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_callexample.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

  1. Otevřete dialogové okno Stránky vlastností projektu. Podrobnosti najdete v tématu Nastavení kompilátoru C++ a vlastností sestavení v sadě Visual Studio.

  2. Vyberte stránku vlastností jazyka C/C++>Vlastnosti>konfigurace.

  3. Upravte neodkazovaný kód a vlastnost data a pak zvolte OK.

Viz také

/Zc (Shoda)