Küçük C kitaplığımda hata raporlama işlevselliği var Yazıyorum. Hata mesajlarına bilgi gömülmesine izin vermek için düz error
işlevine ek olarak bir errorf
işlev sağlamak istiyorum. Printf etrafındaki sargılarda uyarıdan kaçının
/*
* 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);
}
sorun, ben bu uyarıyı olsun
(
-Weverything
anahtarı ile clang 4.0 ile derleme):
uyarı: biçim dizesi neden anlamak değişmez bir dize
değil Bunu yapmak kötü olur. Bu uyarıdan kurtulabilmemin bir yolu var mı? Bir şekilde format
argümanının sio_errorf
argümanının bir string literal olmasını zorunlu kılabilir miyim, böylece derleyici her zaman olacağını ve sadece bunu geçeceğimi biliyor mu?
-Wno-format-nonliteral
'u kullanabileceğimi biliyorum, ancak yalnızca başka insanlar da el ile derledikleri takdirde, bunu yapmazlar. Uyarı kodunu susturup kaynak kodunda bir şey tercih ederim. dize Ben sio_errorf
geçirilen eğer
İdeal hala aslında bir hazır değil uyarı alacağı, ancak bunun mümkün olup olmadığından emin değilim. GCC veya yakınları birini kullanıyorsanız
Hangi derleyici ve ne sürümü, kullandığınız:
itme kullanımı/pop gibi bir şeyle özgün mecrasına restorasyon sağlayacak? –
Clang ('-v' bana" Apple clang version 4.0 "yazıyor), gcc'nin de aynı uyarıyı verdiğinden eminim. – mk12