numeric_limit<short>::max problem mit windows.h und #define max
-
hallo leute
gibt es irgend einen weg um das min max problem zu loesen das mit der windows.h kommt ?
mit NOMINMAX gits wiederrum probleme mit der GDI.
benutze gerade SHRT_MAX anstatt std::numeric_limits<short>::max.btw: hab in der cpp datei, wo ich numerc_limits brauche, ganz oben NOMINMAX definiert, aber das hatte irgendwie keinen effekt. das problem blieb trotzdem.
benutze visual studio 2015
Meep Meep
-
Ev. hilft ganz lokal
#undef max
und#undef min
zu schreiben. So hat das jedenfalls bei mir geholfen.
-
Dieser Thread wurde von Moderator/in Arcoth aus dem Forum C++ (alle ISO-Standards) in das Forum WinAPI verschoben.
Im Zweifelsfall bitte auch folgende Hinweise beachten:
C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?Dieses Posting wurde automatisch erzeugt.
-
Mein Beileid. Ich hatte kürzlich genau dasselbe Problem, bei mir hat allerdings
#define NOMINMAX
weitergeholfen. Ich würde es daher mal mit thetas Vorschlag versuchen.Ansonsten versuche ich selbst Windows-spezifische Sachen immer auf Armeslänge zu halten, und so gut wie möglich wegzukapseln (nur in speziellen .cpp-Dateien einbinden, PIMPL-Idiom wenn man Windows-Datenstrukturen herumreichen muss, etc.).
windows.h
ist diesbezüglich wirklich die übelste Namespace-Seuche, die mir bisher untergekommen ist. Gibt da auch noch eine Reihe anderer Makros die zu schwer entzifferbaren Fehlermeldungen führen können (ich erinnere mich auch noch an Sachen wie far/near und eine Funktion, die eine Projektionsmatrix aufgesetzt hat... natürlich mitfar
undnear
als Parameter).Finnegan
-
Meep Meep schrieb:
benutze gerade SHRT_MAX anstatt std::numeric_limits<short>::max.
`std::numeric_limits<short>::max()
->
(std::numeric_limits<short>::max)()
`
-
hustbaer schrieb:
Meep Meep schrieb:
benutze gerade SHRT_MAX anstatt std::numeric_limits<short>::max.
`std::numeric_limits<short>::max()
->
(std::numeric_limits<short>::max)()
`
Das funktioniert? Bin nicht so 100%ig standfest in der Präprozessor-Syntax, aber das führt tatsächlich dazu, dass
max
nicht expandiert wird? CoolAllerdings würde ich selbst wohl eher zur
#undef
-Variante tendieren, und zwar aus folgendem Grund: Der "normale" Weg wie ichmax()
aufrufe ist üblicherweisestd::numeric_limits<short>::max()
. Das würde ich gerne so beibehalten. Mit den zusätzlichen Klammern hätte ich das Gefühl, dass ich einen Workaround für unsauber geschriebene Makros in die C++-Syntax "reinleaken" lasse (weil die zusätzlichen Klammern eben auch gültige C++-Syntax sind), daher bleibe ich lieber ausschliesslich beim Präprozessor um Probleme mit hingerotzten Präprozessor-Konstrukten auszubügeln. Abgesehen davon ist ein#undef max
selbsterklärender. Nur meine 2 CentFinnegan
-
Geschmacksache. So klappt es bei mir:
#define NOMINMAX // due to conflict with max() #include <windows.h> // warning: no C++ standard! //... using namespace std; void wait() { cout << "wait: Press any key to continue." << endl; cin.clear(); cin.ignore((numeric_limits<streamsize>::max)(), '\n'); cin.get(); } void setConsole() // windows.h { _CONSOLE_SCREEN_BUFFER_INFO info; HANDLE handle = GetStdHandle(STD_OUTPUT_HANDLE); GetConsoleScreenBufferInfo(handle, &info); COORD c; c.X = max<SHORT>(info.dwSize.X, 150); c.Y = max<SHORT>(info.dwSize.Y, 1000); SetConsoleScreenBufferSize(handle, c); SMALL_RECT RECT; RECT.Left = 0; RECT.Top = 0; RECT.Bottom = max(info.srWindow.Bottom - info.srWindow.Top, 40 - 1); RECT.Right = max(c.X - 1, 100 - 1); SetConsoleWindowInfo(handle, TRUE, &RECT); } void textcolor(unsigned short color = 15) // windows.h { SetConsoleTextAttribute(::GetStdHandle(STD_OUTPUT_HANDLE), color); } //...
-
Finnegan schrieb:
Das funktioniert? Bin nicht so 100%ig standfest in der Präprozessor-Syntax, aber das führt tatsächlich dazu, dass
max
nicht expandiert wird? CoolDie Idee ist, dass ein function-like macro nur ersetzt wird, wenn auch die entsprechende Syntax verwendet wird.
§16.3/10 schrieb:
Each subsequent instance of the function-like macro name followed by a
(
as the next preprocessing token introduces the sequence of preprocessing tokens that is replaced by the replacement list in the definition (an invocation of the macro).I.e. wenn du ein Makro als max definiert hast, und dann
max)
schreibst, wird das vom PP nicht angefasst.