2012-07-18 63 views
31

तो मैं सिने से वैध पूर्णांक इनपुट प्राप्त करने का प्रयास कर रहा था, और इस question का उत्तर उपयोग किया।मैं windows.h में अधिकतम मैक्रो से कैसे निपटूं मैं std में अधिकतम के साथ टकरा रहा हूं?

यह अनुशंसा की:

#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); 
} 

कौन सा मुझे विंडोज पर एक त्रुटि देता है, कह रही है कि max मैक्रो है कि कई तर्क नहीं लेता है। जिसका अर्थ है कि मुझे यह

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); 

इसे काम करने के लिए करना है। वह बहुत बदसूरत है; क्या इस मुद्दे के आसपास काम करने का एक बेहतर तरीका है? शायद मुझे max की परिभाषा संग्रहित करनी चाहिए और इसे बाद में फिर से परिभाषित करना चाहिए?

+3

आप शामिल है:

कोड नमूना दृष्टिकोण वर्णन करने के लिए? क्यूं कर? यदि आपको वास्तव में इसकी आवश्यकता है तो आप इसे शामिल करने से पहले ** NOMINMAX ** को परिभाषित करके _min_ और _max_ मैक्रोज़ को परिभाषित करने से बच सकते हैं। –

+1

क्या आप "नेमस्पेस std" का उपयोग कर रहे हैं? यदि ऐसा है, तो आप जानबूझकर नामस्थानों को जोड़ रहे हैं। –

+4

@ पॉलबिकिंगहम: मैक्रोज़ में कोई नेमस्पेस नहीं है, और इस प्रकार विंडोज़ सहित किसी भी सावधानी के बिना हमेशा 'std :: min'/'std :: max' – PlasmaHH

उत्तर

64

मैक्रो NOMINMAX परिभाषित करें:

यह मिनट और Windef.h में अधिकतम परिभाषाओं को दबाने होगा।

8

क्या आप सिर्फ सिने बफर फ्लश करने की कोशिश कर रहे हैं? मैं हमेशा से ही प्रयोग किया है:

cin.ignore(cin.rdbuf()->in_avail()); 
+0

यह एक अच्छा जवाब है, हालांकि मैंने दूसरे को स्वीकार कर लिया है क्योंकि यह सीधे सवाल का जवाब देता है, जबकि आप किसी अन्य तरीके से समस्या के स्रोत को संबोधित करते हैं। :) – Almo

6

आप नहीं जानते हैं कि क्या किसी और NOMINMAX बिना windows.h शामिल हो सकता है, आप एक डमी मैक्रो जो परिभाषा बदले बिना समारोह की तरह मैक्रो आमंत्रण को दबाने के लिए इस्तेमाल किया जा सकता से परिभाषित करें:

#define DUMMY 
... 
std::numeric_limits<std::streamsize>::max DUMMY() 

वास्तव में बहुत सुंदर नहीं है, लेकिन काम करता है और गैर-घुसपैठ कर रहा है।

जब Windows हेडर फाइल के साथ काम कर, मैं, केवल विशेष कोड और हेडर फाइल में शामिल (pimpl यदि आवश्यक का उपयोग करके) द्वारा के रूप में ज्यादा के रूप में मैं कर सकते हैं इसे छिपाने के लिए पसंद करते हैं, क्योंकि यह ग्लोबल नेम स्पेस में बहुत ज्यादा कचरा फेंकता ।

+2

दिलचस्प। जहां भी संभव हो मैं खिड़कियों को छीलने के लिए निश्चित रूप से सलाह का पालन करूँगा। – Almo

32

बस कोष्टक में समारोह नाम लपेट:

(std::numeric_limits<size_type>::max)() 

इस मामले में NOMINMAX मैक्रो के लिए कोई ज़रूरत नहीं है, साथ ही आप संकलक चेतावनी, दृष्टिकोण नहीं मिलेगा

+0

'std :: अधिकतम (ए, बी) 'मेरे लिए काम करता है और अधिक पठनीय है। टेम्पलेट पैरामीटर मैक्रो दबाता है। क्या मैं कुछ भूल रहा हूँ? –

+0

@DaleWilson हां, आप कुछ याद कर रहे हैं। आपका कॉल दो मानों का बड़ा होगा। std :: numeric_limits :: अधिकतम() अधिकतम मान वापस कर देगा जो size_type द्वारा संग्रहीत किया जा सकता है। – Ben

+1

माता-पिता में फ़ंक्शन नाम लपेटना फ़ंक्शन पॉइंटर ले रहा है और इसे फ़ोकस पॉइंटर्स के माध्यम से एक रणनीति पैटर्न को लागू करने के रूप में इसका आह्वान कर रहा है। इससे [कोड में सीधे विचार व्यक्त करना] की सलाह दी जाती है (https://github.com/isocpp/CppCoreGuidelines/blob/master/CppCoreGuidelines.md#p1-express-ideas- प्रत्यक्ष रूप से-in-code) क्योंकि यह अन्य वाक्यविन्यास है बल्कि न्यूनतम और अधिकतम मैक्रोज़ की परिभाषा के आसपास काम करने का प्रयास (फ़ंक्शन पॉइंटर के माध्यम से रणनीति पैटर्न का कार्यान्वयन नहीं)। क्लैंग/एलएलवीएम इंफ्रास्ट्रक्चर किसी भी विंडोज हेडर से पहले "# नामांकित करें" नामांकित करता है "। आईएमओ बेहतर सलाह कौन सा है। –

1

आप उपयोग करना GDI + होते हैं तो NOMINMAX आपके लिए काम नहीं करेगा, क्योंकि जीडीआई के शीर्षलेखों को वैश्विक नामस्थान में min या max की आवश्यकता होती है।

और इस मामले में सबसे सरल कार्यप्रणाली min/max को अनिर्धारित करने के लिए है जब उन्हें अब आवश्यकता नहीं है।

//#define NOMINMAX - this won't work 
#include <Windows.h> 
#include <gdiplus.h> 
#undef max 
#undef min 
... 
#include <cxxopts.hpp> 
+0

संभावित रूप से समस्या को उलट देता है, यद्यपि: यदि नाम शीर्षलेख में हेडर में होता है, तो यहां वर्णित हल किया गया है, और आप इस शीर्षलेख को कहीं भी न्यूनतम/अधिकतम परिभाषित करने की आवश्यकता है - दुर्भाग्य ... – Aconcagua