2012-05-28 14 views
5

Alle meine Header-Dateien verwenden umfassen Wachen sowie Pragma einmal:Kann "#pragma once" Fehler verursachen?

#pragma once 
#ifndef FILE_NAME_H 
#define FILE_NAME_H 

class foo 
{ 
    //foo interface.. 
}; 

#endif /* FILE_NAME_H */ 

Ich verstehe, dass Pragma einmal nicht Standard ist, und kann nicht die gleichen über Compiler sein, aber gibt es eine Chance wird es verursachen und Fehler? Wäre es besser, irgendwie zu testen, ob es zuerst verfügbar ist?

#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 */ 

Ich möchte Pragma einmal als Option zur Verfügung zu stellen Name-kollidierende möglicherweise Beschleunigungs-Kompilierung und zu vermeiden, während immer noch die Kompatibilität zwischen Compiler bereitgestellt wird.

+0

Ich weiß wirklich nicht, C/C++, aber [dieser MSDN-Artikel] (http://msdn.microsoft.com/en-us/library/d9x1s805%28v=vs.71%29.aspx) scheint darauf hinzudeuten, dass unerkannte ignoriert werden. – Ryan

+0

möglich Duplikat von [Ist #pragma einmal ein sicherer Wächter?] (Http://stackoverflow.com/questions/787533/is-pragma-once-a-safe-include-guard) –

+0

Siehe auch [Warum nicht C/C++ #pragma einmal ein ISO-Standard?] (Http://stackoverflow.com/questions/1695807/why-istn-c-cs-pragma-once-an-iso-standard) –

Antwort

9

Wenn #pragma once nicht unterstützt wird, wird es einfach ignoriert werden [Ref # 1] und Kopfschutz werden Sie dienen dem Zweck, also nichts falsch, sie beide in verwenden, können Sie nicht wirklich brauchen alle Prüfungen für die Unterstützung von #pragma once.

So ist die ideale Möglichkeit, sowohl #pragma once zu verwenden und Wachen und Sie haben einen tragbaren Code, der auch die Vorteile der #pragma once Optimierung des Compilers unterstützen kann.


[Ref # 1]
Standard C++ 03: 16,6 Pragma Direktive

Eine Präprozessordirektive des Formulars

# pragma pp-tokensopt new-line

bewirkt, dass die Implementierung, um sich in einer implementierungsdefinierten Weise zu verhalten. Jedes Pragma, das von der Implementierung nicht erkannt wird, wird ignoriert.

5

Der Standard sagt "Jedes Pragma, das nicht von der Implementierung erkannt wird, wird ignoriert.", Also sind Sie wahrscheinlich in Ordnung, auch wenn ein Compiler #pragma einmal nicht kennt.