2014-09-17 3 views
5

पहली समस्या: क्या कुछ पैरामीटर के साथ फ़ंक्शन को कॉल करना संभव है और यह प्रीप्रोसेसिंग समय पर संकलन के बाद किसी अन्य चीज़ में संशोधित हो जाता है या संकलन समय परप्रीप्रोकैसिंग समय पर "फ़ंक्शन कॉल" को संशोधित करना या संकलन समय

#define func(a,b) func(a,sizeof(a),b) 

कुछ सोच सकते हैं कि ऐसी आवश्यकता क्यों उत्पन्न हुई।

असल में मैं विजुअल स्टूडियो 2010 का उपयोग कर विंडोज़ में कोड पोर्ट कर रहा हूं और कुछ ऐसे फ़ंक्शन हैं जो strcpy(), strcat() आदि जैसे बहिष्कृत हैं। यह strcpy_s() के बजाय उपयोग करने के लिए कहता है।

मैं जानता हूँ कि मैं #pragma disable(warning:) का उपयोग कर इसे दबा दिया जा सकता था या की तरह झंडे उपलब्ध कराने के द्वारा:

_CRT_NONSTDC_NO_DEPRRECATE 
_CRT_SECURE_NO_DEPRECATE 
_CRT_SECURE_NO_WARNINGS 

लेकिन मैं ध्यान नहीं देते या उन्हें दबाने के लिए wan't नहीं।

मैं बस के बजाय का उपयोग करके अनदेखी की स्ट्रिंग को बदलने के लिए करने की कोशिश की:

#define strcpy strcpy_s 

यहाँ http://msdn.microsoft.com/en-us/library/td1esda9.aspx के रूप में मैंने पढ़ा तर्क का कोई बेमेल हो अगर मैं दूसरे आर्ग प्रदान नहीं करते हैं।

मेरा मतलब है यह ठीक है, तो मैं इस तरह का उपयोग किया जाना चाहिए:

#define strcpy strcpy_s 
strcpy(dest,src); 

लेकिन इसकी नहीं। यह अभी भी चेतावनी उत्पन्न करता है। strcpy_s की

परिभाषा है:

errno_t strcpy_s(
    char *strDestination, 
    size_t numberOfElements, 
    const char *strSource 
); 

2 समस्या: पहला तर्क एक गतिशील आबंटित स्मृति तो कैसे मैं स्मृति इस सूचक द्वारा बताया के आकार प्राप्त कर सकते हैं करने के लिए एक सूचक है। हालांकि मैंने पढ़ा कि यह संभव नहीं है लेकिन कुछ रास्ता होना चाहिए (उम्मीद है)।

_countof(var) क्या है?

+2

कृपया, कृपया ऐसा न करें। या तो अन्य संस्करणों का उपयोग करें या उन चेतावनियों को बंद करें। – doctorlove

+7

1. यह 'strcpy_s' की एकमात्र परिभाषा नहीं है, क्योंकि आपने आसानी से [** टेम्पलेट संस्करण **] छोड़ दिया है (http://msdn.microsoft.com/en-us/library/td1esda9.aspx) जो तय सरणी से आकार कम कर देता है। 2. गतिशील आवंटन के आकार को हासिल करने के लिए कोई * पोर्टेबल * तरीका नहीं है, केवल कच्चे मेमोरी के लिए इसके सूचक को दिया गया है। मैं डॉ के साथ सहमत हूँ। ऐसा मत करो। यदि आप रनटाइम लाइब्रेरी के सुरक्षा संस्करणों का उपयोग करना चाहते हैं, तो * उनका उपयोग करें *। 3. '_countof' है [** यहां दस्तावेज **] (http://msdn.microsoft.com/en-us/library/ms175773.aspx) – WhozCraig

+4

+1 सिर्फ इसलिए कि प्रश्न में संभावित समाधान भयानक हैं ' टी का मतलब यह सवाल बिल्कुल खराब नहीं है। एक उत्तर के रूप में, यदि आपको क्रॉस-प्लेटफ़ॉर्म बनाने की आवश्यकता है तो गैर-मानक फ़ंक्शंस का उपयोग करने से बचें। और भाषा को बहुत मुश्किल से मत लड़ो। – Bathsheba

उत्तर

2

ये फ़ंक्शन बहिष्कृत नहीं हैं। माइक्रोसॉफ्ट आपको माइक्रोसॉफ्ट-विशिष्ट कोड लिखने के लिए प्रेरित करने की कोशिश कर रहा है कि वे आईएसओ डब्लूजी 14 कमेटी (जो उनके लिए ज़िम्मेदार है) ने ऐसा कोई बयान नहीं दिया है, भले ही उन्हें बहिष्कृत किया गया है।

तीन _CRT मैक्रो को परिभाषित करने के लिए संकलक को "मानक के करीब कुछ" मोड में डालने का सही तरीका माना जाना चाहिए, जैसे /Za

0

MSalters stated के रूप में, इन कार्यों को बहिष्कृत नहीं किया जाता है, वे मानक सी का हिस्सा हैं। अगर वे सही तरीके से उपयोग किए जाते हैं तो सुरक्षित हैं और इन चेतावनियों को दबाने में कुछ भी गलत नहीं है, खासकर, पोर्टेबल कोड लिखते समय। (वे (शायद उनमें से कुछ, पता नहीं) सी 11 मानक के अनुलग्नक के में मानकीकृत हैं, जो अनिवार्य नहीं है।)

लेकिन मैं उन्हें अनदेखा या दबाना नहीं चाहता हूं।

क्यों? चेतावनी दबाने के लिए खुद में एक अच्छी बात नहीं है।

मैं बस का उपयोग करके अनदेखी के बजाय स्ट्रिंग को बदलने के लिए करने की कोशिश की:

#define strcpy strcpy_s 

कि सी के लिए ++ केवल (और केवल एमएस विंडोज के लिए, मैं अगर सी ++ कुछ निर्दिष्ट करता है पता नहीं है काम करता है सी 11 के अनुलग्नक के समान) और यहां तक ​​कि केवल सरणी तर्कों के लिए। सी में, आप एक समान व्यवहार प्राप्त कर सकते हैं:

#define IS_ARRAY(arr) ((char *)(arr) == (char *)&(arr)) 
#define my_strcpy(a, b) (assert(IS_ARRAY(a)) , 
          strcpy_s((a), sizeof(a), (b))) 

या यहां तक ​​कि एक स्थिर दावा - उदा। जीसीसी इसे निरंतर अभिव्यक्ति के रूप में अनुमति देता है; मानक अनुमति देता है, लेकिन इसकी आवश्यकता नहीं है - यह आपको संकलन समय पर सूचक तर्कों के सभी अवसरों को खोजने और उन्हें मैन्युअल रूप से "ठीक" करने की अनुमति देगा। (फिर से, यह एक फिक्स नहीं है, या तो कोड strcpy के साथ पहले से ही सुरक्षित है या यह अभी भी नहीं है, यह क्रैश होने की संभावना अधिक है।)

एक नोट के रूप में, व्यवहार को अपरिभाषित किया गया है, यदि मैक्रो के साथ मानक लाइब्रेरी फ़ंक्शन का नाम परिभाषित किया गया है (यदि संबंधित शीर्षलेख शामिल है)। इस प्रकार, मुझे लगता है कि strcpy कॉल पहले से ही my_strcpy द्वारा प्रतिस्थापित कर दिए गए हैं।

(जैसा कि एक और नोट है, हमेशा ऊपर दिखाए गए अनुसार अपने मैक्रो तर्कों को संश्लेषित करें।)

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