once
pragma
Určuje, že kompilátor obsahuje hlavičkový soubor pouze jednou při kompilaci souboru zdrojového kódu.
Syntaxe
#pragma once
Poznámky
Použití #pragma once
může zkrátit dobu sestavení, protože kompilátor neotevře a znovu přečte soubor za prvním #include
ze souboru v lekci překladu. Označuje se jako optimalizace s více zahrnutími. Má podobný účinek jako idiom include guard , který používá definice maker preprocesoru, aby se zabránilo více zahrnutí obsahu souboru. Pomáhá také zabránit porušení jednoho pravidla definice: požadavek, aby všechny šablony, typy, funkce a objekty v kódu neměly více než jednu definici.
Příklad:
// header.h
#pragma once
// Code placed here is included only once per translation unit
Doporučujeme direktivu #pragma once
pro nový kód, protože neznečistí globální obor názvů symbolem preprocesoru. Vyžaduje méně psaní, je méně rušivé a nemůže způsobit kolize symbolů. Kolize symbolů jsou chyby způsobené tím, že různé soubory hlaviček používají stejný symbol preprocesoru jako hodnota ochrany. Není součástí standardu C++, ale implementuje ho několik běžných kompilátorů.
Neexistuje žádná výhoda použití obou ochranných idiomů a #pragma once
ve stejném souboru. Kompilátor rozpozná idiom include a implementuje optimalizaci multiple-include stejným způsobem jako direktiva #pragma once
, pokud před nebo za standardní formou idiomu nepřichází žádný kód bez komentáře nebo preprocesoru:
// header.h
// Demonstration of the #include guard idiom.
// Note that the defined symbol can be arbitrary.
#ifndef HEADER_H_ // equivalently, #if !defined HEADER_H_
#define HEADER_H_
// Code placed here is included only once per translation unit
#endif // HEADER_H_
Doporučujeme zahrnout idiom ochrany, pokud kód musí být přenositelný na kompilátory, které neimplementují direktivu #pragma once
, udržovat konzistenci s existujícím kódem nebo když optimalizace s více zahrnutími není možné. Může k němu dojít v složitých projektech, když aliasy systému souborů nebo aliasy zahrnují cesty brání kompilátoru v identifikaci identických souborů include podle kanonické cesty.
Dávejte pozor, abyste #pragma once
v souborech hlaviček, které mají být vloženy vícekrát, a používejte symboly preprocesoru k řízení jejich efektů. Příklad tohoto návrhu naleznete v souboru hlavičky <assert.h> . Také buďte opatrní při správě cest zahrnutí, abyste se vyhnuli vytváření více cest k zahrnutým souborům, což může porazit optimalizaci více zahrnutí pro oba zahrnují stráže i #pragma once
.