/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
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
Váš názor
https://aka.ms/ContentUserFeedback.
Připravujeme: V průběhu roku 2024 budeme postupně vyřazovat problémy z GitHub coby mechanismus zpětné vazby pro obsah a nahrazovat ho novým systémem zpětné vazby. Další informace naleznete v tématu:Odeslat a zobrazit názory pro