Wie Makro ignorieren?
-
Nexus schrieb:
drakon schrieb:
Schliesslich gehts Morgen endlich wieder an den Strand..

Na, dann noch schöne Ferien...

Hö.. Das sind keine Ferien.. Habe nur am Wochende frei.

-
Und es gibt noch eine Lösung:
#define NO_MACRO // ... std::numeric_limits<double>::max NO_MACRO ();@drakon,
Ich ruf mal die australischen Behörden an, die sollen dich rauswerfen. Du verschmutzt nur den Strand :p
Grüssli
-
Dravere schrieb:
Und es gibt noch eine Lösung
Wahrscheinlich die hässlichste von allen. :p
Sofern es mit
#define NOMINMAXgeht, würde ich das auch so machen.
-
Nexus schrieb:
Dravere schrieb:
Und es gibt noch eine Lösung
Wahrscheinlich die hässlichste von allen. :p
Sofern es mit
#define NOMINMAXgeht, würde ich das auch so machen.Hässlich, aber praktisch. Vor allem wenn das min oder max aus dem Windowsheader benötigt wird, zum Beispiel in der Bibliothek, welche man eingebunden hat und welche eben den Windowsheader einbindet. Mit diesem Hilfsmakro kann man genau sagen, wann will man das Makro verwenden und wann nicht

Grüssli
-
@Dravere:
Da max ein function-style Makro ist kann man es wie schon erwähnt wurde genausogut klammern. Was an der "NO_MACRO" Variante schöner sein soll weiss ich nicht.@drakon:
Wieso soll der Tip Mist sein? Das Problem kann man nicht beheben da es in den Windows Headern drinnen ist. Wenn man Code schreibt der von anderen Programmen inkludiert werden muss (z.b. weil Templates definiert werden) kann man die "NOMINMAX" Variante und #undef Varianten vergessen - die Programme könnten bereits (ohne NOMINMAX definiert zu haben) windows.h inkludiert haben, und die Programme könnten sich darauf verlassen dass die min und max Makros definiert sind. In dem Fall ist die "schönste" Lösung IMO immer noch (std::min)(a, b) bzw. (std::numeric_limits<T>::max)().Wenn man Code schreibt der NICHT von fremden Programmen inkludiert wird ist IMO #define NOMINMAX die beste Lösung.
Stell dir ansonsten ja auch mal vor, dass du etwas m_MaxCount nennen willst.. Dann hast du schon das nächste Problem..
Wieso sollte DAS denn bitte ein Problem machen? Ich kenne zumindest kein Header-File welches "m_MaxCount" als Makro definiert.
-
hustbaer schrieb:
Was an der "NO_MACRO" Variante schöner sein soll weiss ich nicht.
Ist wohl wieder so ein Fall von Geschmacksache. Ich finde da sieht man gleich, was man erreichen wollte. Die Klammerung sieht einfach nur kryptisch aus und man versteht nicht auf Anhieb, was dort passiert. Klar, kann man noch ein Kommentar hinsetzen, sollte man wohl sogar

Grüssli
-
hustbaer schrieb:
@Dravere:
Da max ein function-style Makro ist kann man es wie schon erwähnt wurde genausogut klammern. Was an der "NO_MACRO" Variante schöner sein soll weiss ich nicht.
Wie ich gerade gelernt habe kann es offenbar einen subtilen Unterschied geben: die benutzung von ADL.
Die Klammer Lösung (std::min)(a,b) wählt natürlich immer das "min" aus dem Namespace std. Will man aber dass der Compiler selbst entscheidet aus welchem Namespace das "min" kommen soll, ist die "NO_MACRO" Lösung die richtige Wahl.Zu dem ganze Kontext gibt es in boost folgende Empfehlung
siehe http://www.boost.org/development/requirements.html
Make sure your code compiles in the presence of the min() and max() macros. Some platform headers define min() and max() macros which cause some common C++ constructs to fail to compile. Some simple tricks can protect your code from inappropriate macro substitution:
If you want to call std::min() or std::max():
If you do not require argument-dependent look-up, use (std::min)(a,b).
If you do require argument-dependent look-up, you should:#include <boost/config.hpp>
Use BOOST_USING_STD_MIN(); to bring std::min() into the current scope.
Use min BOOST_PREVENT_MACRO_SUBSTITUTION (a,b); to make an argument-dependent call to min(a,b).If you want to call std::numeric_limits<int>::max(), use (std::numeric_limits<int>::max)() instead.
If you want to call a min() or max() member function, instead to doing obj.min(), use (obj.min)().
If you want to declare or define a function or a member function named min or max, then you must use the BOOST_PREVENT_MACRO_SUBSTITUTION macro. Instead of writing int min() { return 0; } you should write int min BOOST_PREVENT_MACRO_SUBSTITUTION () { return 0; } This is true regardless if the function is a free (namespace scope) function, a member function or a static member function, and it applies for the function declaration as well as for the function definition.und natürlich ist es am einfachsten, schönsten und besten wenn man die Makros min und max vermeiden kann.
Grüsse
-
hustbaer schrieb:
Wenn man Code schreibt der von anderen Programmen inkludiert werden muss (z.b. weil Templates definiert werden)
...kann man NOMINMAX projektweit setzen.
-
Seikilos schrieb:
Ah, danke für die schnelle Hilfe. Aber so ist es im Projekt komplett weg, was ungünstig sein könnte.
gibt es so etwas auch temporär ?Naja, könnte man das Makro nicht "suspenden":
#ifdef max #define MAX_BACKUP max #undef max // .. mein Code #ifdef MAX_BACKUP #define max MAX_BACKUPist zwar auch nicht schön (ich bin sowieso kein "Makrofreund") , sollte aber funktionieren, oder?
Gruß,
Simon2.
-
Bei Visual Studio geht sowas mit #pragma push_macro("macroname") und #pragma pop_macro.
http://msdn.microsoft.com/en-us/library/2bs04eza(VS.71).aspx
rya.
-
Simon2 schrieb:
ist zwar auch nicht schön (ich bin sowieso kein "Makrofreund") , sollte aber funktionieren, oder?
Nein, die gleiche Frage stellte schon pumuckl im anderen (von mir verlinkten) Thread.

Das Problem besteht darin, dass Makros nur textuell ersetzt werden.
-
Nexus schrieb:
...Das Problem besteht darin, dass Makros nur textuell ersetzt werden.
*vor-die-stirn-klatsch*Ich hatte sowas mal mit reinen "#ifdef-Schaltern" machen müssen und das klappt naürlich ....
*schubber-und-schnell-vergess*
Gruß,
Simon2.