Dela via


once pragma

Anger att kompilatorn endast innehåller huvudfilen en gång när en källkodsfil kompileras.

Syntax

#pragma once

Anmärkningar

Användningen av #pragma once kan minska byggtiden eftersom kompilatorn inte öppnas och läser filen igen efter den första #include av filen i översättningsenheten. Det kallas optimering med flera inkluderingar. Den har en effekt som liknar inkludera guard- idiom, som använder makrodefinitioner för förprocessorer för att förhindra flera inkluderingar av innehållet i filen. Det hjälper också till att förhindra överträdelser av en definitionsregel: kravet att alla mallar, typer, funktioner och objekt inte har mer än en definition i koden.

Till exempel:

// header.h
#pragma once
// Code placed here is included only once per translation unit

Vi rekommenderar #pragma once-direktivet för ny kod eftersom det inte förorenar det globala namnområdet med en preprocessorsymbol. Det kräver mindre skrivning, det är mindre distraherande och det kan inte orsaka symbolkollisioner. Symbolkollisioner är fel som orsakas när olika huvudfiler använder samma preprocessorsymbol som skyddsvärdet. Den är inte en del av C++ Standard, men den implementeras portabelt av flera vanliga kompilatorer.

Det finns ingen fördel med att använda både include guard-formspråket och #pragma once i samma fil. Kompilatorn identifierar include guard-formspråket och implementerar optimeringen med flera inkluderingar på samma sätt som #pragma once-direktivet om ingen icke-kommentarskod eller förprocessordirektiv kommer före eller efter standardformen för idiom:

// 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_

Vi rekommenderar att du inkluderar skydds-idiom när koden måste vara portabel för kompilatorer som inte implementerar #pragma once-direktivet, för att upprätthålla konsekvens med befintlig kod eller när optimeringen med flera inkluderingar är omöjlig. Det kan inträffa i komplexa projekt när filsystemalias eller aliassökvägar förhindrar att kompilatorn identifierar identiska inkluderingsfiler efter kanonisk sökväg.

Var noga med att inte använda #pragma once eller include guard-formspråket i huvudfiler som är utformade för att inkluderas flera gånger, som använder preprocessorsymboler för att kontrollera deras effekter. Ett exempel på den här designen finns i <assert.h> rubrikfil. Var också noga med att hantera dina inkluderingssökvägar för att undvika att skapa flera sökvägar till inkluderade filer, vilket kan besegra optimeringen med flera inkluderingar för både inkludera vakter och #pragma once.

Se även

Pragma-direktiv och nyckelorden __pragma och _Pragma