#pragma
-
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:
-
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 >