#pragma



  • Artchi schrieb:

    Und #pragma once macht das was in der Beschreibung steht. Denn zu #pragma once gibt es eine Beschreibung in der msdn.com Es ist ein (meiner Meinung nach) besserer Include-Guard zum elenden #ifndef-Zeug.

    Mag sein, aber das #ifndef-#define-#endif hat zwei Vorteile:

    - nicht von Microsoft-Compiler abhängig, da standardkonform
    - man kann anhand eines #ifdef/#ifndef in einem anderen Header feststellen, ob die entsprechende Datei schon eingebunden wurde (wird in vielen Windows-Headern und in GUI-Bibliotheken verwendet)

    Deswegen rate ich von dem #pragma once ab, auch wenn es weniger Schreibarbeit ist 😉

    Moritz



  • audacia schrieb:

    - nicht von Microsoft-Compiler abhängig, da standardkonform

    Hem, ist #ifndef usw. auch im C++ Standard? Sind doch alles nur Makros für den Präprocessor. NIchts desto trotz, laut Forenbeiträgen kann das mittlerweile auch der GCC. Ich selbst kann das nicht sagen, da ich keinen GCC benutze. Aber #pragma once müsste auch performancemäßig schneller sein als das ifndef-Geraffel.

    audacia schrieb:

    - man kann anhand eines #ifdef/#ifndef in einem anderen Header feststellen, ob die entsprechende Datei schon eingebunden wurde (wird in vielen Windows-Headern und in GUI-Bibliotheken verwendet)

    Kann mir darunter leider nichts vorstellen. Hast du ein Beispiel?



  • Artchi schrieb:

    Aber #pragma once müsste auch performancemäßig schneller sein als das ifndef-Geraffel.

    Also wenn ich ein Compilerbauer wäre, dann würde ich mir etwas einfallen lassen, damit das ifndef-Geraffel genau so schnell wird. Aber schöner ist natürlich ein pragma once. Noch schöner wäre es, wenn man sich all dies sparen könnte. Ist mir schleierhaft, wieso sich da nicht von Anfang an jemand Gedanken gemacht hat wie man das schöner machen könnte.



  • Das mit dem pragma ist doch hier http://www.c-plusplus.net/forum/viewtopic-var-t-is-35478.html alles schon mal abgehandelt worden.



  • Artchi schrieb:

    audacia schrieb:

    - nicht von Microsoft-Compiler abhängig, da standardkonform

    Hem, ist #ifndef usw. auch im C++ Standard? Sind doch alles nur Makros für den Präprocessor. NIchts desto trotz, laut Forenbeiträgen kann das mittlerweile auch der GCC. Ich selbst kann das nicht sagen, da ich keinen GCC benutze. Aber #pragma once müsste auch performancemäßig schneller sein als das ifndef-Geraffel.

    Es ist schon durch den Standard sichergestellt, dass #ifndef überall klappt. Hier auch ein paar Zahlen:

    http://www.gamesfromwithin.com/articles/0501/000067.html



  • nebenbei: mit #pragma kann man auch das Byte Alignment von Strukturen (mmh Strukturen gibts ja in C++ eigentlich nicht - dann halt von Klassen) beeinflussen

    MSVC Net 2003:

    #pragma pack(push,packing)
    	#pragma pack(1)
    
             // byte aligenment = 1
    
             #pragma pack(pop, packing)
    

    mit g++ geht das aber wieder anders

    __attribute__((packed))
    


  • Mit pragma kann man auch Optimierungen aus und einschalten usw. Ich brauche es aber bis auf pragma once eher selten.



  • Walli schrieb:

    Mit pragma kann man auch Optimierungen aus und einschalten usw. Ich brauche es aber bis auf pragma once eher selten.

    pragma warning brauch ich ständig... 🙂



  • Artchi schrieb:

    Hem, ist #ifndef usw. auch im C++ Standard?

    AFAIK ja.

    Sind doch alles nur Makros für den Präprocessor. Nichtsdestotrotz, laut Forenbeiträgen kann das mittlerweile auch der GCC. Ich selbst kann das nicht sagen, da ich keinen GCC benutze. Aber #pragma once müsste auch performancemäßig schneller sein als das ifndef-Geraffel.

    Ob mein Compiler da ein paar µs mehr braucht, ist mir angesichts der Plattformunabhängigkeit ziemlich egal. Außerdem kann ich mir gut vorstellen, daß die meisten Compiler in der Lage sind, Include-Guards zu erkennen und zu optimieren.

    Artchi schrieb:

    Kann mir darunter leider nichts vorstellen. Hast du ein Beispiel?

    Viele 🙂

    Hier aus einer Borland VCL-Headerdatei:

    #if defined(VCL_FULL)                 // BCB v1.0 compatible
    #define NO_WIN32_LEAN_AND_MEAN
    #endif
    
    #if !defined(_WINDOWS_)               // Don't optimize if WINDOWS.H has already been included
    #if !defined(NO_WIN32_LEAN_AND_MEAN)
    #define WIN32_LEAN_AND_MEAN           // Enable LEAN_AND_MEAN support
    #define  _VCL_LEAN_AND_MEAN           // BCB v1.0 compatible
    #endif                                // NO_WIN32_LEAN_AND_MEAN
    #endif                                // _WINDOWS_
    
    #if !defined(COM_NO_WINDOWS_H)        // Make sure COM Headers don't include WINDOWS.H/OLE2.H
    #define COM_NO_WINDOWS_H
    #define UNDEF_COM_NO_WINDOWS_H
    #endif
    
    #if !defined(RPC_NO_WINDOWS_H)        // Make sure RPC Headers don't include WINDOWS.H
    #define RPC_NO_WINDOWS_H
    #define UNDEF_RPC_NO_WINDOWS_H
    #endif
    

    Oder etwas aus der Windows-API:

    #ifndef _WINDOWS_
    
    //
    // Battery Class-Miniport device driver interfaces
    //
    
    typedef
    NTSTATUS
    (*BCLASS_QUERY_TAG)(
        IN PVOID Context,
        OUT PULONG BatteryTag
        );
    ...
    #endif
    

    (aus batclass.h)

    und

    #if defined (WIN32) && !defined (MAC)   /* Must include WINDOWS.H on Win32 */
    #ifndef _WINDOWS_
    #define INC_OLE2 /* Get the OLE2 stuff */
    #define INC_RPC  /* harmless on Windows NT; Windows 95 needs it */
    #define _INC_OLE /* Windows 95 will include OLE1 without this */
    #include <windows.h>
    #endif
    

    (aus wabdefs.h)

    Und viele mehr...

    Moritz



  • godlikebot schrieb:

    Walli schrieb:

    Mit pragma kann man auch Optimierungen aus und einschalten usw. Ich brauche es aber bis auf pragma once eher selten.

    pragma warning brauch ich ständig... 🙂

    Ich nur bei dieser einen blödsinnigen Warnung im VC, die kommt, wenn ein Typ nach der Auflösung länger als 255 Zeichen ist. Kann man die eigentlich irgendwo global abstellen?



  • Walli schrieb:

    Ich nur bei dieser einen blödsinnigen Warnung im VC, die kommt, wenn ein Typ nach der Auflösung länger als 255 Zeichen ist. Kann man die eigentlich irgendwo global abstellen?

    Benutze mal nen aktuelle VC++, dann biste das Problem ganz los.



  • Mache ich ja. Aber ich muss auf der Arbeit gelegentlich noch mit dem alten arbeiten.



  • 255 Zeichen??? poste mal den Variablennamen 🤡



  • Vertexwahn schrieb:

    255 Zeichen??? poste mal den Variablennamen 🤡

    Es war kein Variablenname...

    std::reverse_bidirectional_iterator<
      std::_Tree<unsigned long,std::pair<unsigned long const,int>,
      std::map<unsigned long,int,std::less<unsigned long>,std::allocator<int>>::_Kfn,std::less<unsigned long>,
      std::allocator<int>>::iterator,std::pair<unsigned long const int>,
      std::pair<unsigned long const,int> &,std::pair<unsigned long const,int> ,int
    >
    

Anmelden zum Antworten