2009-12-15 20 views
55

इस लाइन को सही ढंग से एक छोटे से परीक्षण कार्यक्रम में काम करता है, लेकिन कार्यक्रम है जिसके लिए मैं यह चाहते में, मैं निम्नलिखित संकलक शिकायतें मिलती है:चेतावनी C4003 और त्रुटियों C2589 और C2059 पर: x = std :: numeric_limits <int> :: अधिकतम();

#include <limits> 
using namespace std; 

x = numeric_limits<int>::max(); 

:

#include <limits> 

x = std::numeric_limits<int>::max(); 

c:\...\x.cpp(192) : warning C4003: not enough actual parameters for macro 'max' 
c:\...\x.cpp(192) : error C2589: '(' : illegal token on right side of '::' 
c:\...\x.cpp(192) : error C2059: syntax error : '::' 

मैं के साथ एक ही परिणाम प्राप्त यह मैक्रो अधिकतम (ए, बी) के रूप में अधिकतम क्यों देख रहा है; ?

+0

मेरे मामले में, '-DNOMINMAX' के बिना मुझे आंतरिक कंपाइलर त्रुटि मिल रही थी। यह देखना मनोरंजक है कि माइक्रोसॉफ्ट लगातार अपने खिलाफ कैसे संघर्ष करता है। –

उत्तर

74

जब एक Windows हैडर कि एक min या max मैक्रो को परिभाषित करता है सहित यह आमतौर पर होता है। यदि आप विंडोज हेडर का उपयोग कर रहे हैं, तो अपने कोड में #define NOMINMAX डालें, या समकक्ष कंपाइलर स्विच के साथ बनाएं (यानी विजुअल स्टूडियो के लिए /DNOMINMAX का उपयोग करें)।

ध्यान दें कि NOMINMAX के साथ भवन आपके पूरे कार्यक्रम में मैक्रो का उपयोग अक्षम करता है। यदि आपको min या max संचालन का उपयोग करने की आवश्यकता है, तो शीर्षलेख से std::min() या std::max() का उपयोग करें।

+0

ठीक है, मुझे बस पूछना है ... क्या मेरे पास एक ही फाइल में दोनों हो सकते हैं? x = std :: numeric_limits :: अधिकतम(); // कुछ मुश्किल प्रीप्रोसेसर कमांड सी = अधिकतम (ए, बी); – Harvey

+0

@ हार्वे: मैंने एक फ़ाइल में अधिकतम() और मैक्रो अधिकतम() के उपयोग को संबोधित करने के लिए अपना उत्तर संपादित कर दिया है। –

+0

मैं इस परियोजना में अन्य फ़ाइलों में न्यूनतम() और अधिकतम() का उपयोग करता हूं और प्रीकंपील्ड हेडर का उपयोग करके, यह सभी फ़ाइलों के लिए अक्षम है। #undef मेरे मामले के लिए अधिकतम काम करता है और यह बाकी फ़ाइल के लिए केवल प्रभावी है। – Harvey

27

कुछ अन्य शीर्षलेख फ़ाइल अधिकतम मैक्रो के साथ वैश्विक नाम स्थान को प्रदूषित कर रही है। आपको लगता है कि ठीक कर सकते हैं मैक्रो अपरिभाषित कर:

#undef max 
x = std::numeric_limits<int>::max(); 
+5

इसे इस तरह ठीक न करें, आप इसे 'NOMINMAX' के साथ पहली जगह में परिभाषित होने से रोक सकते हैं। – GManNickG

61

अन्य समाधान इस तरह के कोष्ठक के साथ फ़ंक्शन नाम लपेटना होगा: (std::numeric_limits<int>::max)()std::max पर भी लागू होता है।

सुनिश्चित नहीं है कि यह इसके लिए अच्छा समाधान है ... NOMINMAX बेहतर आईएमओ है, लेकिन यह कुछ मामलों में एक विकल्प हो सकता है।

static _Ty (max)() _THROW0() 
{ // return maximum value 
    return (FLT_MAX); 
} 

तो मैं सिर्फ FLT_MAX उपयोग कर रहा हूँ:

+1

जितना अधिक मैं वैश्विक न्यूनतम/अधिकतम मैक्रोज़ के उपयोग से नफरत करता हूं, कभी-कभी उन्हें पूरी तरह से किसी परियोजना से निकालना मुश्किल होता है। इसे समाधान के रूप में कभी नहीं सोचा, तो +1। – icabod

+6

दुर्भाग्य से, विंडोज प्लेटफ़ॉर्म एसडीके में न्यूनतम और अधिकतम मैक्रोज़ का व्यापक रूप से उपयोग किया जाता है (उदाहरण के लिए जीडीआई + GdiplusTypes.h में)। तो, आप उत्तर बेहतर है तो NOMINMAX परिभाषित करें। +1! – 23W

+0

रैपिंग यहां कैसे मदद करता है? वास्तव में उलझन में, क्या आप थोड़ा सा समझा सकते हैं? – sami1592

3
#ifdef max 
#pragma push_macro("max") 
#undef max 
#define _restore_max_ 
#endif 

#include <limits> 

//... your stuff that uses limits 

#ifdef _restore_max_ 
#pragma pop_macro("max") 
#undef _restore_max_ 
#endif 
+0

@MattMcNabb मैंने इसे बदल दिया – dmjalund

0

विजुअल स्टूडियो 2013 में मेरे लिए में इसकी परिभाषा (बेहतर रिक्ति के लिए स्वरूपित ...) इस प्रकार है। :) यह एक सार्वभौमिक समाधान नहीं हो सकता है, लेकिन यह मेरे मामले में अच्छी तरह से काम करता है, इसलिए मैंने सोचा कि मैं साझा करूंगा।

+1

सावधान रहें, आपको 'FLT_MAX' तक पहुंच के लिए '#' शामिल करना होगा –

संबंधित मुद्दे