2012-05-28 14 views
5

Wszystkie moje pliki nagłówka używać obejmują strażników jak pragmy raz:Czy "#pragma once" może potencjalnie powodować błędy?

#pragma once 
#ifndef FILE_NAME_H 
#define FILE_NAME_H 

class foo 
{ 
    //foo interface.. 
}; 

#endif /* FILE_NAME_H */ 

Rozumiem, że pragma raz nie jest standardem i nie mogą być takie same w całej kompilatorów, ale jest jakiś szansa, że ​​to spowoduje i błąd? Czy lepiej jakoś przetestować, czy jest on dostępny jako pierwszy?

#ifdef THIS_COMPILER_SUPPORTS_PRAGMA_ONCE 
    #pragma once 
#endif 

#ifndef FILE_NAME_H 
#define FILE_NAME_H 

class foo 
{ 
    //foo interface.. 
}; 

#endif /* FILE_NAME_H */ 

Chcę zapewnić pragmy raz jako opcja do kompilacji możliwie szybkiego i uniknąć imienin zderzeniu, zapewniając jednocześnie zgodność całej kompilatorów.

+0

ja naprawdę nie wiem, C/C++, ale [ten artykuł MSDN] (http://msdn.microsoft.com/en-us/library/d9x1s805%28v=vs.71%29.aspx) wydaje się sugerować, że nierozpoznane są ignorowane. – Ryan

+0

możliwy duplikat [Czy #pragma raz bezpieczny zawiera strażnik?] (Http://stackoverflow.com/questions/787533/is-pragma-once-a-safe-include-guard) –

+0

Zobacz także [Dlaczego nie #pragma C/C++ raz standard ISO?] (Http://stackoverflow.com/questions/1695807/why-isnt-c-cs-pragma-once-an-iso-standard) –

Odpowiedz

9

Jeśli #pragma once nie jest obsługiwana będzie to po prostu ignorowane [Ref # 1] i header strażników będzie służył celowi, więc nic złego w ich użyciu zarówno naprawdę nie potrzeba żadnego czek na wsparciu #pragma once.

Idealnym sposobem jest użycie zarówno #pragma once, jak i załączników, a także przenośnego kodu, który może również skorzystać z optymalizacji, którą może obsługiwać kompilator.


[Nr 1] 03
standard C++ 16,6 dyrektywy Pragma

Dyrektywa przerób formy

# pragma pp-tokensopt new-line

powoduje implementacja do zachowania w sposób zdefiniowany przez implementację. Każda pragma, która nie jest rozpoznawana przez implementację, jest ignorowana.

5

Standard mówi: "Każda pragma, która nie jest rozpoznawana przez implementację, jest ignorowana.", Więc prawdopodobnie masz rację, nawet jeśli kompilator nie zna #pragma raz.