problem mit numerical_limits<int>::max()
-
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...
