2011-02-06 15 views
28

पर NOMINMAX के साथ संभावित समस्याएं मेरे प्रोग्राम में किसी और चीज से पहले NOMINMAX को परिभाषित करते समय मुझे क्या समस्याएं मिल सकती हैं?विजुअल सी ++

जहाँ तक मुझे पता है, इस <Windows.h>min और max मैक्रो ऐसी है कि एसटीएल के साथ कई संघर्ष, उदा को परिभाषित नहीं कर देगा std::min(), std::max(), या std::numeric_limits<T>::min() हल हो गए हैं।

क्या मैं इस धारणा में सही हूं कि केवल विंडोज-विशिष्ट और विरासत कोड में समस्याएं होंगी? लगभग सभी पुस्तकालयों को मैक्रोज़ के रूप में परिभाषित min() और max() पर निर्भर नहीं होना चाहिए?

संपादित करें: क्या अन्य विंडोज हेडर के साथ समस्याएं हो सकती हैं?

+1

वहाँ नहीं समस्याओं, यहां तक ​​कि विंडोज-विशिष्ट कोड के साथ होना चाहिए, लेकिन यह संभव है कि कुछ कोड मौजूद है जो काम नहीं करेगा। आप इसे क्यों नहीं देखते हैं और देखते हैं कि कोई त्रुटि है या नहीं? –

+0

हमारे आंतरिक कोड के लिए, 'NOMINMAX' अच्छी तरह से काम करता है। हालांकि, पुस्तकालय का उपयोग बाहरी डेवलपर्स द्वारा भी किया जाता है और मैं अपने अनुप्रयोगों को तोड़ना नहीं चाहता हूं। – Manuel

+1

'# परिभाषित 'एक संकलन-समय ऑपरेशन है। पुस्तकालयों में शामिल हैं, संकलित नहीं हैं। इसका मतलब है कि वे अपने स्वयं के स्वतंत्र '# परिभाषित कर सकते हैं। लाइब्रेरी उपयोगकर्ता यह नहीं देख पाएंगे कि आप '# 'परिभाषित करें' NOMINMAX' – MSalters

उत्तर

47

NOMINMAX का उपयोग <windows.h> शामिल करने का एकमात्र गैर-पूरी तरह से बुरा तरीका नहीं है। आपको UNICODE और STRICT भी परिभाषित करना चाहिए। हालांकि उत्तरार्द्ध को आधुनिक कार्यान्वयन द्वारा डिफ़ॉल्ट रूप से परिभाषित किया गया है।

हालांकि आप माइक्रोसॉफ्ट ’ एस हेडर के साथ समस्याओं में भाग ले सकते हैं, उदा। GdiPlus के लिए। मैं ’ मीटर किसी भी अन्य कंपनियों या व्यक्तियों से शीर्षकों के साथ समस्याओं की जानकारी नहीं है।

हैडर एक नाम स्थान को परिभाषित करता है, तो GdiPlus करता है, तो एक ठीक using namespace std; (या वैकल्पिक रूप using std::min; और using std::max) प्रासंगिक शीर्षक, जहां शामिल <algorithm> के लिए एक आवरण बनाने के लिए है, और हैडर ’ रों नाम स्थान के अंदर,:

#define NOMINMAX 
#include <algorithm> 
namespace Gdiplus 
{ 
    using std::min; 
    using std::max; 
} 

ध्यान दें कि कि शीर्षक में वैश्विक क्षेत्र है, जो कभी नहीं करना चाहिए पर एक using namespace std; से बहुत अलग है।

मैं डॉन मामले में जहां कोई नाम स्थान नहीं है के लिए किसी भी अच्छे तरीके का उपयोग ’ टी पता है, लेकिन खुशी से मैं हेवन ’ टी कि में चलाने के लिए, तो व्यवहार में विशेष समस्या शायद विवादास्पद है।

+1

तो GdiPlus के लिए, समस्या को चारों ओर काम किया जा सकता है? – Manuel

+1

@ मैनुअल: हाँ, जाहिर है। मुझे वीज़ल शब्द "स्पष्ट रूप से" के साथ योग्यता शामिल करनी है क्योंकि जब मैंने जो किया है उसके लिए यह अच्छी तरह से काम करता है, तो मैं गारंटी नहीं दे सकता कि कुछ बुराई GdiPlus कोड नहीं है जिसका मैंने उपयोग नहीं किया है। कहीं। –

+0

एक और समाधान एसटीएल के 'मिनट ',' अधिकतम' के _ go go_ को जाना है और संकलक को अपनी जीडीआईपीएलस परियोजनाओं के लिए विंडफ.h के 'min',' max' का उपयोग करने दें। कोई बड़ी बात नहीं। – bobobobo

11

मैं आम तौर पर संभावित दुष्प्रभावों को सीमित करने के NOMINMAX इस तरह का उपयोग करें:

#define NOMINMAX 
#include <windows.h> 
#undef NOMINMAX 

इस तरह NOMINMAX के दायरे अपेक्षाकृत सीमित है।

यह एक सही समाधान नहीं है। अगर कुछ और पहले से ही NOMINMAX परिभाषित कर चुका है, तो यह पैटर्न विफल रहता है (हालांकि मुझे ऐसा कोई मामला कभी नहीं मिला है)।

यदि आप वास्तव में वास्तव में सावधान रहना चाहते हैं, तो आप # wrapcluded windows.h जहां कहीं भी एक रैपर शीर्षलेख शामिल कर सकते हैं। आवरण कुछ इस तरह जाना होगा:

/* Include this file instead of including <windows.h> directly. */ 
#ifdef NOMINMAX 
#include <windows.h> 
#else 
#define NOMINMAX 
#include <windows.h> 
#undef NOMINMAX 
#endif 

आप UNICODE और/या STRICT को लागू करने की तरह है, आवरण में अन्य कार्य कर भी कल्पना कर सकता।

0

प्रीकंपील्ड हेडर (जैसे stdafx।ज) मैं इस का उपयोग करें:

#define NOMINMAX 
#include <algorithm> 
#include <Windows.h> 
#ifndef min 
#define min(x,y) ((x) < (y) ? (x) : (y)) 
#endif 
#ifndef max 
#define max(x,y) ((x) > (y) ? (x) : (y)) 
#endif 
#include <gdiplus.h> 
#undef min 
#undef max 
0

मैं इस क्रम में हेडर और नामस्थान की घोषणा के द्वारा ठीक मुद्दा मिल गया:

#include <windows.h> 
#include <minmax.h> 
#include <gdiplus.h> 

using namespace Gdiplus; 
using namespace std;