ऐतिहासिक रूप से, मिनजीडब्ल्यू एक अजीब परिस्थिति में रहा है, खासकर जहां तक सी 99 समर्थन जाता है। MinGW ज्यादातर msvcrt.dll रनटाइम पर निर्भर करता है जो विंडोज के साथ वितरित किया जाता है, और वह रनटाइम C99 का समर्थन नहीं करता है।
तो मिनजीडब्ल्यू के पुराने संस्करणों के साथ, आप सी 99-विशिष्ट प्रारूप विनिर्देशकों का उपयोग करते समय सी 99 मोड में समस्याओं में भाग ले सकते हैं। ऐतिहासिक रूप से, जीसीसी ने सीएस विनिर्देशकों के लिए msvcrt.dll की समर्थन की कमी के लिए कोई विशेष आवास नहीं बनाया। तो आप उन परिस्थितियों में आ जाएंगे जहां -Wformat
एक प्रारूप के बारे में चेतावनी नहीं देगा जो काम नहीं करेगा। -
हालात दोनों पक्षों पर सुधार कर रहे हैं जीसीसी जैसे कि जब एमएस क्रम के साथ प्रयोग किया -Wformat के लिए विशिष्ट समर्थन, है:
- तो
-Wpedantic-ms-format
कि जीसीसी शिकायत नहीं होगा "I32"
के बारे में और "I64"
(यह भले ही दस्तावेज, मैं अभी भी यह और भी 4.7.0 में गैर मान्यता प्राप्त होने के बारे में एक शिकायत प्राप्त - शायद यह एकदम नया)
__attribute__((__format__))
करने के लिए ms_printf
विकल्प नहीं है पर दूसरी ओर, एमएनजीडब्ल्यू ने थोड़ी देर के लिए अपना खुद का snprintf()
प्रदान किया है, क्योंकि एमएसवीसी के संस्करण, _snprintf()
, काफी अलग तरीके से व्यवहार करते हैं। हालांकि, एमजीजीडब्ल्यू ने printf()
पर msvcrt.dll में लंबे समय तक निर्भर किया, इसलिए printf()
के लिए सी 99 प्रारूप विनिर्देशक काम नहीं कर पाए। कुछ बिंदु पर मिनजीडब्ल्यू ने इसे printf()
और दोस्तों के अपने संस्करण प्रदान करना शुरू किया ताकि आप उचित सी 99 (और जीएनयू?) समर्थन प्राप्त कर सकें। हालांकि, ऐसा लगता है कि रूढ़िवादी पक्ष पर होना, इन्हें शुरुआत में msvcrt.dll संस्करणों को प्रतिस्थापित नहीं किया गया था। उनके पास __mingw_printf()
जैसे नाम हैं।
यह 4.6.1 और 4.7.0 के बीच किसी बिंदु पर दिखता है, मिनजीडब्ल्यू हेडर ने msvcrt.dll फ़ंक्शन के लिए प्रतिस्थापन के रूप में MinGW आपूर्ति किए गए संस्करणों का उपयोग करना शुरू किया (कम से कम यदि आपने C99 निर्दिष्ट किया है)।
हालांकि, ऐसा लगता है कि नए संस्करणों के साथ, जीसीसी और मिनजीडब्ल्यू अभी भी सिंक से बाहर हैं। जहां पहले जीसीसी विनिर्देशकों के बारे में चेतावनी नहीं देगी जो वास्तव में मिनजीडब्लू पर काम नहीं करेंगे, न कि यह स्पिस्पायर के बारे में शिकायत करेगा।
आप MinGW समर्थन "hhX"
की कितनी अच्छी तरह अपने संस्करण देखने के लिए कोड की निम्न snipet की कोशिश करना चाहते हो सकता है:
printf("%hhX\n", 0x11223344);
__mingw_printf("%hhX\n", 0x11223344);
मुझे यकीन है कि समस्या आप में चला रहे हैं ठीक करने के लिए सुझाव देने के लिए क्या नहीं कर रहा हूँ - मुझे लगता है कि आप MinGW stdio.h
शीर्षलेख को पैच करने में सक्षम हो सकते हैं ताकि उसके पास printf फ़ंक्शंस पर __attribute__((__format__ (gnu_printf, ...)))
विशेषता हो (वे नए stdio.h
में नहीं हैं, इसलिए जीसीसी प्रारूप का समर्थन करने के बारे में इसका डिफ़ॉल्ट विचार उपयोग करेगा)।
जब आप कहते हैं कि __attribute__((__format__ (FORMAT, ...)))
, FORMAT
का मूल्य हो सकता है (printf का संबंध है जहाँ तक) निम्न में से एक:
दिलचस्प है, यह जीसीसी 4.3.4 के साथ ठीक काम करता है: http://ideone.com/LAPP9। मैंने 4.1.2 के साथ भी कोशिश की है, और यह भी ठीक है। –
मिनजीडब्ल्यू जीसीसी 4.6.1 का उपयोग करके मुझे 'printf() 'और' snprintf() 'दोनों पर चेतावनियां मिलती हैं - आप किस मिनजीडब्ल्यू डिस्ट्रो का उपयोग कर रहे हैं? मैं वर्तमान में टीडीएम वितरण का उपयोग कर रहा हूं। –
@ माइकलबुर: ओह, मुझे यह भी एहसास नहीं हुआ कि कई मिनजीडब्ल्यू डिस्ट्रोज़ थे। मैं "मानक" का उपयोग कर रहा हूं, मुझे लगता है ([mingw.org] (http://www.mingw.org/), https://sourceforge.net/projects/mingw/files/Installer/mingw के साथ स्थापित जाओ-Inst /)। क्या इससे कोई फर्क पड़ता है? – Socob