के आसपास रैपर में चेतावनी से बचें मुझे अपनी छोटी सी लाइब्रेरी में एक त्रुटि रिपोर्टिंग कार्यक्षमता है जो मैं लिख रहा हूं। मैं आसानी से त्रुटि संदेशों में एम्बेडिंग जानकारी को अनुमति देने के लिए सादा error
फ़ंक्शन के अलावा errorf
फ़ंक्शन प्रदान करना चाहता हूं।printf
/*
* Prints a formatted error message. Use it as you would use 'printf'. See the
* 'sio_error' function.
*/
void sio_errorf(const char *format, ...) {
// Print the error prefix
if (g_input == STDIN) fputs("error: ", stderr);
else fprintf(stderr, "%s: ", g_progname);
// Pass on the varargs on to 'vfprintf'.
va_list arglist;
va_start(arglist, format);
// This may produce the following warning -- ignore it:
// warning: format string is not a string literal
vfprintf(stderr, format, arglist);
va_end(arglist);
fputc('\n', stderr);
}
समस्या, मैं इस चेतावनी मिलता है (बजना 4.0 के साथ संकलन -Weverything
स्विच के साथ):
चेतावनी: प्रारूप स्ट्रिंग एक स्ट्रिंग शाब्दिक
मुझे समझ में क्यों नहीं है ऐसा करना बुरा होगा। क्या इस तरह की चेतावनी से छुटकारा पाने का कोई तरीका है? क्या मैं किसी भी तरह से लागू कर सकता हूं कि format
तर्क sio_errorf
स्ट्रिंग अक्षरशः हो, ताकि संकलक जानता है कि यह हमेशा होगा, और मैं इसे बस पास कर रहा हूं?
मुझे पता है कि मैं -Wno-format-nonliteral
का उपयोग कर सकता हूं, लेकिन केवल अगर अन्य लोग इसे मैन्युअल रूप से संकलित करने जा रहे हैं, तो वे ऐसा नहीं करेंगे। मैं स्रोत कोड में कुछ ऐसा चाहता हूं जो चेतावनी को शांत करता है।
आदर्श रूप में मैं अब भी अगर स्ट्रिंग मैं sio_errorf
के लिए पारित चेतावनी मिलेगा वास्तव में एक शाब्दिक नहीं है, लेकिन मुझे यकीन है कि अगर संभव है नहीं कर रहा हूँ।
कौन सा संकलक, और कौन-सा संस्करण है, तो आप उपयोग कर रहे हैं? –
क्लैंग ('-v' मुझे" ऐप्पल क्लैंग संस्करण 4.0 "बताता है), हालांकि मुझे पूरा यकीन है कि जीसीसी एक ही चेतावनी देता है। – mk12