Wie gehe ich mit dem Max-Makro in windows.h mit max in std kollidieren?
So, ich habe versucht, gültige integer-Eingabe von cin, und verwendet eine Antwort auf diese Frage.
Empfohlen:
#include <Windows.h> //includes WinDef.h which defines min() max()
#include <iostream>
using std::cin;
using std::cout;
void Foo()
{
int delay = 0;
do
{
if(cin.fail())
{
cin.clear();
cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
}
cout << "Enter number of seconds between submissions: ";
} while(!(cin >> delay) || delay == 0);
}
Gibt mir eine Fehlermeldung unter Windows, die sagen, dass die max
makro nicht, dass viele Argumente. Das bedeutet, ich habe zu tun, diese
do
{
if(cin.fail())
{
cin.clear();
#undef max
cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
}
cout << "Enter number of seconds between submissions: ";
} while(!(cin >> delay) || delay == 0);
Um es an die Arbeit. Das ist ziemlich hässlich; gibt es einen besseren Weg, um dieses Problem zu umgehen? Vielleicht sollte ich die Speicherung der definition von max
und neu zu definieren es danach?
Kommentar zu dem Problem - Öffnen
Tun Sie include <windows.h> ? Warum? Wenn Sie es wirklich benötigen können Sie vermeiden, definieren von min und max Makros durch die Definition von NOMINMAX vor.
Sind Sie mit namespace "std"? Wenn ja, sind Sie bewusst auf die Kombination von namespaces.
@PaulBeckingham: Makros haben keine namespaces, und demzufolge auch windows.h ohne Vorsichtsmaßnahmen werden immer kollidieren mit
std::min
/std::max
mögliche Duplikate von Seltsame C++ Fehler mit code, min()/max () - Aufrufe
InformationsquelleAutor der Frage Almo | 2012-07-18
Du musst angemeldet sein, um einen Kommentar abzugeben.
Definieren das makro
NOMINMAX
:InformationsquelleAutor der Antwort hmjd
Nur wickeln Sie den Namen der Funktion in Klammern:
Keine Notwendigkeit für die NOMINMAX makro in diesem Fall, plus erhalten Sie keine compiler-Warnungen
InformationsquelleAutor der Antwort NIRO
Sind Sie nur versuchen zu Spülen, die cin-Puffer? Ich habe immer nur verwendet:
InformationsquelleAutor der Antwort Littlegator
Wenn Sie nicht wissen, ob jemand anderes möglicherweise
windows.h
ohneNOMINMAX
möglich, ein dummy-makro, die verwendet werden können, zu unterdrücken-Funktion-wie makro-Aufrufe ohne änderung der definition:Nicht wirklich schön, aber funktioniert und ist nicht aufdringlich.
Beim arbeiten mit der Windows-header Datei, die ich lieber verstecken Sie es, so viel wie ich kann, indem es nur in den spezialisierten code-und header-Dateien (Verwendung von pimpl, wenn nötig), weil es wirft einfach zu viel Müll in den globalen namespace.
InformationsquelleAutor der Antwort Philipp
Wenn Sie geschehen, um die GDI+ verwenden, der Ansatz mit
NOMINMAX
wird nicht für Sie arbeiten, weil die Header von GDI+ benötigenmin
odermax
im globalen namespace.Und die einfachste Lösung in diesem Fall ist zu löschen
min
/max
wenn Sie nicht mehr benötigt werden.Code-Beispiel zur Veranschaulichung der Vorgehensweise:
InformationsquelleAutor der Antwort AntonK