सी ++। चेतावनी स्तर 4 प्लस अतिरिक्त चेतावनियों का भार भी सक्षम है। मैं उम्मीद करता हूं कि यह चेतावनी देने के लिए कम से कम, लेकिन अधिक संभावना है कि एक कंपाइलर त्रुटि?यह संकलन क्यों/कैसे करता है? एमएस विजुअल स्टूडियो 2008 में
int printfLikeFunction(
const int bufferLength,
char * const buffer,
const char * const format,
...);
कोड उपयोग - उसमें कोई लेखन त्रुटि है::
समारोह घोषणा इस प्रकार है, हालांकि outputBuffer की ARRAY_SIZE में पारित हो जाता है, outputBuffer ही नहीं है - निश्चित रूप से यह संकलन नहीं करना चाहिए:
printfLikeFunction(ARRAY_SIZE(outputBuffer), "Format: %s, %s", arg1, arg2);
स्पष्ट रूप से यह गलत है और एक गलती की गई है। हालांकि संकलक इसे पकड़ा जाना चाहिए था! बफर पैरामीटर एक चार-पॉइंटर होना चाहिए, और इसे एक स्ट्रिंग अक्षर दिया जा रहा है जो एक कॉन्स चार-पॉइंटर है। यह एक त्रुटि होनी चाहिए। (arg1 और arg2 (संभवतः कॉन्स) चार पॉइंटर्स हैं, इसलिए संयोग से घोषणा आउटपुट के बिना भी मेल खाती है बफर सही जगह पर है)।
रन टाइम पर, यह कोड क्रैश होता है क्योंकि यह स्ट्रिंग अक्षर में लिखने का प्रयास करता है। वहां कोई आश्चर्य की बात नहीं है, मुझे समझ में नहीं आता कि इसे संकलित करने की अनुमति कैसे थी।
(हालांकि, आकस्मिक रूप से, यह संभवतः यह है कि sprintf_s में इस फ़ंक्शन के लिए एक अलग क्रम में बफर और आकार पैरामीटर क्यों हैं - यह ऐसी त्रुटियों को स्पष्ट रूप से विफल करता है)।
वाह। क्या पागल निर्णय है! लेकिन, हाँ, मैंने अभी मानक की जांच की है और आप बिल्कुल सही हैं। अविश्वसनीय! –
आप उम्मीद करेंगे कि मानक स्टूडियो मानक की बहिष्कृत और पागल सुविधाओं का उपयोग करते समय चेतावनी जारी करेगा। –
हां ... भले ही "पागलपन" व्यक्तिपरक है, बहिष्कृत नहीं है, इसलिए यह मुझे आश्चर्यचकित करता है कि इससे कोई चेतावनी उत्पन्न नहीं हुई है। –