Hi,
Current CPP definitions for *printf and *scanf
(with__USE_MINGW_ANSI_STDIO >= 0) in
mingw-w64-headers/crt/_mingw_print_pop.h are too invasive.
Example:
myfile.h:189:47:
warning: '__mingw_printf' is an unrecognized format function type [-Wformat]
when preprocessing "void func(const char *format, ...)
__attribute__((printf(format, 1, 2)));
This also breaks C++ objects using members named after the standard
functions, like:
class A {
public:
QString &sprintf(const char *format, ...)
};
like seen in Qt4
Attached patch use GCC variadic macros (using the GNU extension and not
the C99 feature, to keep compatibility with previous versions of the C
standard) to fix these problems. See
http://gcc.gnu.org/onlinedocs/cpp/Variadic-Macros.html for more details.
HOWEVER
The attached patch doesn't fix completely the C++ case, if
standard functions are redefined inside a class with a different number
of arguments.
For example QString (of qt4) class redefines sprintf without the
"char *str" argument, because it is assumed that the first argument
points to the class instance.
It seems that mingw32 solved that in a different way, I'm looking at
their repository to extract the patch and adapt it to mingw64
So I'm just opening the thread and will post another patch tomorrow.
--
Rafaël Carré
Index: trunk/mingw-w64-headers/crt/_mingw_print_pop.h
===================================================================
--- trunk/mingw-w64-headers/crt/_mingw_print_pop.h (révision 4514)
+++ trunk/mingw-w64-headers/crt/_mingw_print_pop.h (copie de travail)
@@ -7,21 +7,21 @@
/* Define __mingw_<printf> macros. */
#if defined(__USE_MINGW_ANSI_STDIO) && (defined(_INC_STDIO) || defined(_WSTDIO_DEFINED)) && ((__USE_MINGW_ANSI_STDIO + 0) != 0)
#ifdef _INC_STDIO
-#define fprintf __mingw_fprintf
-#define printf __mingw_printf
-#define sprintf __mingw_sprintf
-#define snprintf __mingw_snprintf
-#define vfprintf __mingw_vfprintf
-#define vprintf __mingw_vprintf
-#define vsprintf __mingw_vsprintf
-#define vsnprintf __mingw_vsnprintf
+#define fprintf(f, fmt , args...) __mingw_fprintf(f, fmt, ##args)
+#define printf(fmt , args...) __mingw_printf(fmt, ##args)
+#define sprintf(c, fmt , args...) __mingw_sprintf(c, fmt, ##args)
+#define snprintf(c, s, fmt, args...) __mingw_snprintf(c, s, fmt, ##args)
+#define vfprintf(f, fmt, ap) __mingw_vfprintf(f, fmt, ap)
+#define vprintf(fmt, ap) __mingw_vprintf(fmt, ap)
+#define vsprintf(c, fmt, ap) __mingw_vsprintf(c, fmt, ap)
+#define vsnprintf(c, s, fmt, ap) __mingw_vsnprintf(c, s, fmt, ap)
-#define sscanf __mingw_sscanf
-#define vsscanf __mingw_vsscanf
-#define scanf __mingw_scanf
-#define vscanf __mingw_vscanf
-#define fscanf __mingw_fscanf
-#define vfscanf __mingw_vfscanf
+#define sscanf(s, fmt , args...) __mingw_sscanf(s, fmt, ##args)
+#define vsscanf(s, fmt, ap) __mingw_vsscanf(s, fmt, ap)
+#define scanf(fmt , args...) __mingw_scanf(fmt, ##args)
+#define vscanf(fmt, ap) __mingw_vscanf(fmt, ap)
+#define fscanf(f, fmt , args...) __mingw_fscanf(f, fmt, ##args)
+#define vfscanf(f, fmt, ap) __mingw_vfscanf(f, fmt, ap)
#define asprintf __mingw_asprintf
#define vasprintf __mingw_vasprintf
@@ -38,14 +38,14 @@
#undef snwprintf
#undef vsnwprintf
-#define fwprintf __mingw_fwprintf
-#define wprintf __mingw_wprintf
-#define vfwprintf __mingw_vfwprintf
-#define vwprintf __mingw_vwprintf
-#define swprintf __mingw_swprintf
-#define vswprintf __mingw_vswprintf
-#define snwprintf __mingw_snwprintf
-#define vsnwprintf __mingw_vsnwprintf
+#define fwprintf(f, fmt , args...) __mingw_fwprintf(f, fmt, ##args)
+#define wprintf(fmt , args...) __mingw_wprintf(fmt, ##args)
+#define swprintf(c, fmt , args...) __mingw_swprintf(c, fmt, ##args)
+#define snwprintf(c, s, fmt, args...) __mingw_snwprintf(c, s, fmt, ##args)
+#define vfwprintf(f, fmt, ap) __mingw_vfwprintf(f, fmt, ap)
+#define vwprintf(fmt, ap) __mingw_vwprintf(fmt, ap)
+#define vswprintf(c, fmt, ap) __mingw_vswprintf(c, fmt, ap)
+#define vsnwprintf(c, s, fmt, ap) __mingw_vsnwprintf(c, s, fmt, ap)
#undef swscanf
#undef vswscanf
@@ -54,12 +54,12 @@
#undef fwscanf
#undef vfwscanf
-#define swscanf __mingw_swscanf
-#define vswscanf __mingw_vswscanf
-#define wscanf __mingw_wscanf
-#define vwscanf __mingw_vwscanf
-#define fwscanf __mingw_fwscanf
-#define vfwscanf __mingw_vfwscanf
+#define swscanf(s, fmt , args...) __mingw_swscanf(s, fmt, ##args)
+#define vswscanf(s, fmt, ap) __mingw_vswscanf(s, fmt, ap)
+#define wscanf(fmt , args...) __mingw_wscanf(fmt, ##args)
+#define vwscanf(fmt, ap) __mingw_vwscanf(fmt, ap)
+#define fwscanf(f, fmt , args...) __mingw_fwscanf(f, fmt, ##args)
+#define vfwscanf(f, fmt, ap) __mingw_vfwscanf(f, fmt, ap)
#endif
------------------------------------------------------------------------------
All of the data generated in your IT infrastructure is seriously valuable.
Why? It contains a definitive record of application performance, security
threats, fraudulent activity, and more. Splunk takes this data and makes
sense of it. IT sense. And common sense.
http://p.sf.net/sfu/splunk-d2dcopy2
_______________________________________________
Mingw-w64-public mailing list
Mingw-w64-public@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/mingw-w64-public