problem mit numerical_limits<int>::max()
-
Mein erster Vorschlag bestand darin, eine intelligente Fehlermeldung zu produzieren (und das ist auch das Einzige, was ich selbst tun würde - wenn überhaupt).
Grundsätzlich ist es richtig, dass man nicht mit jedem Unfug, den man vor Einbinden des Headers machen kann, umgehen können muss. Praktisch stellt sich aber eher die Frage, ob es in bestimmten bekannten Fällen zuviel verlangt ist. Da eine solche Überprüfung in jedem einzelnen Header die Wartbarkeit nicht fördert, ist sie eher etwas für einen zentralen Konfigurationsheader, den man im Falle einer etwas umfangreicheren Bibliothek ohnehin oft hat, um sich auf das konkrete System, für das kompiliert wird, einzustellen (natürlich muss man sich auch dabei intelligent anstellen: die Überprüfung darf nicht durch include-Guards geschützt sein).
-
Hallo,
es gibt sogar Compiler (Microsoft/g++), die die #pragmas push_macro/pop_macro kennen:
http://msdn.microsoft.com/en-us/library/2bs04eza(VS.80).aspx
MfG,
Probe-Nutzer
-
das scheint ja genau das zu sein was ich suche, leider functioniert das pop_macro irgend wie nich:
#ifdef min # pragma push_macro("min") # undef min # define popmin #endif #ifdef max # pragma push_macro("max") # undef max # define popmax #endif MyClass() :m_count(0) ,m_min(numeric_limits<T>::max()) ,m_max(numeric_limits<T>::min()) ,m_sum(0) {}; MyClass(T i) :m_count(0) ,m_min(numeric_limits<T>::max()) ,m_max(numeric_limits<T>::min()) ,m_sum(0) { operator=(i); }; #ifdef popmax # pragma pop_macro("max") # undef popmax #endif #ifdef popmin # pragma pop_macro("min") # undef popmin #endif
-
Probe-Nutzer schrieb:
Hallo,
es gibt sogar Compiler (Microsoft/g++), die die #pragmas push_macro/pop_macro kennen:
http://msdn.microsoft.com/en-us/library/2bs04eza(VS.80).aspx
MfG,
Probe-Nutzer
In der gcc-Dokumentation kann ich nichts dazu finden. Die MSDN-Beschreibung lässt darauf schließen, dass das Ganze nur für Objektmakros funktioniert.
-
Wenn man die Makros nicht einfach #undefen kann (ja das kommt vor), geht auch folgende Methode (auch wenns nicht mehr ganz so schön aussieht):
#define NO_MACRO MyClass() :m_count(0) ,m_min(numeric_limits<T>::max NO_MACRO ()) ,m_max(numeric_limits<T>::min NO_MACRO ()) ,m_sum(0) {}; MyClass(T i) :m_count(0) ,m_min(numeric_limits<T>::max NO_MACRO ()) ,m_max(numeric_limits<T>::min NO_MACRO ()) ,m_sum(0) { operator=(i); };
-
@derkuchen
danke, es ist zwar wirklich nicht mehr so schön, aber das löst das Problem auf sicherste und unkomplizierteste weise.
-
camper schrieb:
Probe-Nutzer schrieb:
Hallo,
es gibt sogar Compiler (Microsoft/g++), die die #pragmas push_macro/pop_macro kennen:
http://msdn.microsoft.com/en-us/library/2bs04eza(VS.80).aspx
MfG,
Probe-Nutzer
In der gcc-Dokumentation kann ich nichts dazu finden.
Ich habe irgendwo für gcc geschriebenen Code gesehen, der das verwendet, und ich habe jetzt auch noch einmal gesucht, und das hier:
http://gcc.gnu.org/onlinedocs/gcc/Push_002fPop-Macro-Pragmas.html
gefunden.
camper schrieb:
Die MSDN-Beschreibung lässt darauf schließen, dass das Ganze nur für Objektmakros funktioniert.
Siehe unten.
vlad_tepesch schrieb:
das scheint ja genau das zu sein was ich suche, leider functioniert das pop_macro irgend wie nich:
#ifdef min # pragma push_macro("min") # undef min # define popmin #endif #ifdef max # pragma push_macro("max") # undef max # define popmax #endif MyClass() :m_count(0) ,m_min(numeric_limits<T>::max()) ,m_max(numeric_limits<T>::min()) ,m_sum(0) {}; MyClass(T i) :m_count(0) ,m_min(numeric_limits<T>::max()) ,m_max(numeric_limits<T>::min()) ,m_sum(0) { operator=(i); }; #ifdef popmax # pragma pop_macro("max") # undef popmax #endif #ifdef popmin # pragma pop_macro("min") # undef popmin #endifIch habe das, an dein Beispiel angelehnt, mit dem VS2005, Service Pack 1, versucht:
#include <limits> #include <iostream> #include <windows.h> using namespace std; #ifdef min # pragma push_macro("min") # undef min # define popmin #endif #ifdef max # pragma push_macro("max") # undef max # define popmax #endif template<class T> class MyClass { public: MyClass() :m_count(0) ,m_min(numeric_limits<T>::max()) ,m_max(numeric_limits<T>::min()) ,m_sum(0) {}; MyClass(T i) :m_count(0) ,m_min(numeric_limits<T>::max()) ,m_max(numeric_limits<T>::min()) ,m_sum(0) { operator=(i); }; private: int m_sum; int m_min; int m_max; int m_count; }; #ifdef popmax # pragma pop_macro("max") # undef popmax #endif #ifdef popmin # pragma pop_macro("min") # undef popmin #endif int main(int argc, char* argv[]) { int a = 6; int b = 7; MyClass<int> test; MyClass<int> test2; cout << max(a, b) << endl; return 0; }und es funktioniert.
MfG,
Probe-Nutzer
-
und es funktioniert.
Der teil funktioniert ja auch, aber die makros min/max, werden nicht richtig redefiniert.
(ich arbeite mit vc++ 8 SP1)
-
vlad_tepesch schrieb:
und es funktioniert.
Der teil funktioniert ja auch, aber die makros min/max, werden nicht richtig redefiniert.
(ich arbeite mit vc++ 8 SP1)
Ok, kann ich jetzt nichts weiter dazu sagen, mein Code liefert jedenfalls das Maximum wieder. Aber wir haben hier jetzt auch schon einige Lösungen gesehen, insofern betrachte man die pop_macro/push_macro-Idee nur als eine Anmerkung von mir.
MfG,
Probe-Nutzer
-
Probe-Nutzer schrieb:
Ich habe irgendwo für gcc geschriebenen Code gesehen, der das verwendet, und ich habe jetzt auch noch einmal gesucht, und das hier:
http://gcc.gnu.org/onlinedocs/gcc/Push_002fPop-Macro-Pragmas.html
gefunden.
Bei der PDF-Version fehlen die Abschnitte 5.52.11 und 5.52.12 - das müsste man gewusst haben...
