/external
(Diagnostika externích hlaviček)
Možnosti /external
kompilátoru umožňují určit chování diagnostiky kompilátoru pro určité soubory hlaviček. Hlavičky "Externí" jsou přirozeným doplňkem "Jen můj kód": Soubory hlaviček, jako jsou systémové soubory nebo soubory knihovny třetích stran, které nemůžete nebo nechcete změnit. Vzhledem k tomu, že tyto soubory nezměníte, můžete se rozhodnout, že není užitečné vidět diagnostické zprávy z kompilátoru o nich. Možnosti kompilátoru /external
poskytují kontrolu nad těmito upozorněními.
Možnosti kompilátoru /external
jsou dostupné od sady Visual Studio 2017 verze 15.6. Ve verzích sady Visual Studio před sadou Visual Studio 2019 verze 16.10 /external
vyžadují, abyste také nastavili možnost kompilátoru /experimental:external
.
Syntaxe
Použijte možnosti externí hlavičky (není vyžadováno ve verzi 16.10 a novější):
/experimental:external
Zadejte externí hlavičky:
/external:anglebrackets
/external:env:
var
/external:I
path
Určení chování diagnostiky:
/external:W0
/external:W1
/external:W2
/external:W3
/external:W4
/external:templates-
Argumenty
/experimental:external
Povolí možnosti externích hlaviček. Tato možnost není vyžadována v sadě Visual Studio 2019 verze 16.10 a novější.
/external:anglebrackets
Zachází se všemi záhlavími, které jsou součástí #include <header>
, kde header
je soubor uzavřený v úhlových závorkách (< >
), jako externí záhlaví.
/external:I
path
Definuje kořenový adresář, který obsahuje externí hlavičky. Všechny rekurzivní podadresáře path
jsou považovány za externí, ale do seznamu adresářů, které kompilátor hledá v souborech include, se přidá pouze path
hodnota. Mezera mezi /external:I
a path
je nepovinná. Adresáře, které obsahují mezery, musí být uzavřeny do dvojitých uvozovek. Adresář může být absolutní nebo relativní cesta.
/external:env:
var
Určuje název proměnné var
prostředí, která obsahuje seznam externích adresářů hlaviček oddělený středníkem. Je užitečné pro systémy sestavení, které spoléhají na proměnné prostředí, jako INCLUDE
je například , které používáte k určení seznamu externích souborů zahrnutí. Nebo , pro soubory, CAExcludePath
které by neměly být analyzovány /analyze
. Můžete například zadat /external:env:INCLUDE
, aby se každý adresář v INCLUDE
externím adresáři záhlaví najednou. Je to stejné jako použití /external:I
k určení jednotlivých adresářů, ale mnohem méně podrobné. var
Mezi a /external:env:
.
/external:Wn
Tato možnost nastaví výchozí úroveň upozornění ( n
hodnota od 0 do 4) pro externí hlavičky. /external:W0
Například efektivně vypne upozornění pro externí hlavičky. Pokud tato možnost není zadaná, kompilátor vydá upozornění příkazového řádku D9007 pro další /external
možnosti. Tyto možnosti jsou ignorovány, protože by neměly žádný vliv.
Tato /external:Wn
možnost má podobný efekt jako zabalení zahrnuté hlavičky do direktivy #pragma warning
:
#pragma warning (push, 0)
// the global warning level is now 0 here
#include <external_header>
#pragma warning (pop)
/external:templates-
Umožňuje upozornění z externích hlaviček, když se objeví v šabloně, která se vytvoří v kódu.
Poznámky
Ve výchozím nastavení platí pro všechny soubory úroveň upozornění, /Wn
kterou pro sestavení zadáte. Možnosti pro zadání externích hlaviček definují pouze sadu souborů, na které můžete použít jinou výchozí úroveň upozornění. Pokud tedy zadáte externí hlavičky, použijte /external:Wn
také k určení úrovně externího upozornění pro změnu chování kompilátoru.
Všechny existující mechanismy pro povolení, zakázání a potlačení upozornění stále fungují v externích i ne externích souborech. Například direktiva warning
pragma může přepsat výchozí úroveň upozornění, kterou jste nastavili pro externí hlavičky.
Příklad: Nastavení úrovně externího upozornění
Tento ukázkový program má dva zdrojové soubory program.cpp
a header_file.h
. Soubor header_file.h
je v include_dir
podadresáři adresáře obsahujícího program.cpp
soubor:
Zdrojový soubor include_dir/header_file.h
:
// External header: include_dir/header_file.h
template <typename T>
struct sample_struct
{
static const T value = -7; // W4: warning C4245: 'initializing':
// conversion from 'int' to 'unsigned int', signed/unsigned mismatch
};
Zdrojový soubor program.cpp
:
// User code: program.cpp
#include <header_file.h>
int main()
{
return sample_struct<unsigned int>().value;
}
Ukázku můžete sestavit pomocí tohoto příkazového řádku:
cl /EHsc /I include_dir /W4 program.cpp
Podle očekávání vygeneruje tato ukázka upozornění:
program.cpp
include_dir\header_file.h(6): warning C4245: 'initializing': conversion from 'int' to 'const T', signed/unsigned mismatch
with
[
T=unsigned int
]
program.cpp(6): note: see reference to class template instantiation 'sample_struct<unsigned int>' being compiled
Pokud chcete zacházet se souborem záhlaví jako s externím souborem a potlačit upozornění, můžete místo toho* použít tento příkazový řádek:
cl /EHsc /I include_dir /external:anglebrackets /external:W0 /W4 program.cpp
Tento příkazový řádek potlačí upozornění uvnitř header_file.h
při zachování upozornění uvnitř program.cpp
.
Upozornění přes vnitřní a vnější hranici
Nastavení nízké úrovně upozornění pro externí záhlaví může skrýt některá upozornění s možností akce. Konkrétně může vypnout upozornění vygenerované při vytváření instancí šablony v uživatelském kódu. Tato upozornění můžou znamenat problém v kódu, ke kterému dochází pouze v instancích pro konkrétní typy. (Pokud jste například zapomněli použít vlastnost typu odebrání const
nebo &
.) Pokud se chcete vyhnout upozorněním v rámci šablon definovaných v externích záhlavích, můžete použít /external:templates-
tuto možnost. Kompilátor bere v úvahu efektivní úroveň upozornění v souboru, která definuje šablonu, a úroveň upozornění, ve které dochází k vytvoření instance šablony. Upozornění vygenerovaná uvnitř externí šablony se zobrazí, pokud je šablona vytvořena v rámci ne externího kódu. Tento příkazový řádek například znovu povolí upozornění ze zdrojů šablony v ukázkovém kódu*:
cl /EHsc /I include_dir /external:anglebrackets /external:W0 /external:templates- /W4 program.cpp
Ve výstupu se znovu zobrazí upozornění C4245, i když je kód šablony uvnitř externí hlavičky.
Povolení, zakázání nebo potlačení upozornění
Všechny existující mechanismy pro povolení, zakázání a potlačení upozornění stále fungují v externích hlavičkách. Když se zobrazí upozornění, protože tuto možnost používáte /external:templates-
, můžete upozornění potlačit v okamžiku vytvoření instance. Pokud chcete například explicitně potlačit upozornění v ukázce, která se znovu zobrazí z důvodu /external:templates-
, použijte direktivu warning
pragma:
int main()
{
#pragma warning( suppress : 4245)
return sample_struct<unsigned int>().value;
}
Autoři knihovny můžou použít stejné mechanismy k vynucení určitých upozornění nebo všech upozornění na určité úrovni, pokud mají pocit, že tato upozornění by nikdy neměla být umlčena /external:Wn
. Například tato verze souboru hlaviček vynutí upozornění C4245, aby ohlásila chybu:
// External header: include_dir/header_file.h
#pragma warning( push, 4 )
#pragma warning( error : 4245 )
template <typename T>
struct sample_struct
{
static const T value = -7; // W4: warning C4245: 'initializing': conversion from 'int'
// to 'unsigned int', signed/unsigned mismatch
};
#pragma warning( pop )
Při této změně hlavičky knihovny autor knihovny zajistí, že globální úroveň upozornění v této hlavičce je 4, bez ohledu na to, co je zadáno v /external:Wn
. Nyní jsou hlášena všechna upozornění úrovně 4 a vyšší. Autor knihovny může také vynutit, aby některá upozornění byla chybná, zakázaná, potlačená nebo vygenerovaná pouze jednou v hlavičce. Možnosti /external
nepřepíší záměrnou volbu.
system_header
direktiva pragma
#pragma system_header
je rušivá značka, která umožňuje zapisovačům knihoven označit určitá záhlaví jako externí. Soubor obsahující #pragma system_header
se považuje za externí z bodu direktivy pragma na konec souboru, jako by byl na příkazovém řádku zadán jako externí. Kompilátor generuje jakoukoli diagnostiku po direktivě pragma na úrovni upozornění určené ./external:Wn
Další informace najdete v tématu system_header
direktiva pragma.
Omezení
Některé upozornění vygenerované back-endovým generováním kódu kompilátoru nejsou ovlivněny možnostmi /external
. Tato upozornění obvykle začínají C47XX, ale ne všechna upozornění C47XX jsou upozornění back-endu. Tato upozornění můžete přesto zakázat jednotlivě pomocí nástroje /wd47XX
. Upozornění analýzy kódu také nemají vliv, protože nemají úrovně upozornění.
Nastavení tohoto parametru kompilátoru ve vývojovém prostředí Visual Studio
V sadě Visual Studio 2019 verze 16.10 a novější:
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í Vlastností>konfigurace VC++.
Nastavte vlastnost External Include Directories určit ekvivalent
/external:I path
IDE možnosti pro každou cestu oddělenou středníkem.Vyberte stránku vlastností konfigurace>C/C++>External Includes.
Nastavit vlastnosti:
Pokud chcete nastavit možnost, nastavte možnost Nastavit jako externí soubory zahrnuté do úhlových závorek jako externí.
/external:anglebrackets
Úroveň upozornění externího záhlaví umožňuje nastavit
/external:Wn
možnost. Pokud je tato hodnota nastavená na Úroveň upozornění projektu nebo výchozí,/external
ostatní možnosti se ignorují.Nastavení diagnostiky šablony v externích hlavičkách na hodnotu Ano
/external:templates-
Změny uložíte kliknutím na OK nebo Použít .
Ve verzích sady Visual Studio před sadou Visual Studio 2019 verze 16.10:
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í příkazového řádku C/C++>Vlastnosti>konfigurace.
/experimental:external
Do pole Další možnosti zadejte možnost a další/external
možnosti kompilátoru.Změny uložíte kliknutím na OK nebo Použít .
Programové nastavení tohoto parametru kompilátoru
- Viz třída AdditionalOptions.
* Přidejte /experimental:external
možnost pro povolení možností externích hlaviček ve verzích sady Visual Studio před sadou Visual Studio 2019 verze 16.10.
Viz také
Možnosti kompilátoru MSVC
Syntaxe příkazového řádku kompilátoru MSVC