mingw中的swprintf函数声明与iso c语言标准的有些差异,这个函数定义在wchar.h中。
iso c99标准定义如下:
int swprintf (wchar_t* ws, size_t len, const wchar_t* format, ...);
而在mingw当中是这样的:
int swprintf (wchar_t*, const wchar_t*, ...);
少了一个size_t的参数,这是什么原因造成的呢?
mingw当中定义的swprintf是由windows提供的msvcrt.dll实现的,
而msvcrt.dll在windows 95中就存在了。
1995年iso c99标准还没有问世,而iso c89标准又没有定义wchar.h。
所以大概就是windows 95编写的时候,还没有swprintf函数,所以呢这是一个windows系统自定义的非标准函数。
后来swprintf正式进入iso c99标准,但是函数声明却与windows内置的swprintf不一致!!!
结果就是微软被iso坑了啊..............
但是此时微软已经发布了windows 95, windows 98...
那怎么办?要是直接把msvcrt.dll里面的swprintf改为iso标准的实现,那么以前基于旧版本开发的软件就没发运行了。
所以msvcrt.dll是肯定不能改的,后果很严重,但是又不能不兼容iso c标准的定义。
后来我查了vc++4.2和vc++6.0版本定义的swprintf都是和mingw一样的。
从vs2005开始才发生了变化,通过宏定义_CRT_NON_CONFORMING_SWPRINTFS,区分新旧版本swprintf。
如果定义了这个宏则使用旧版swprintf,没有定义则使用新版swprintf。
而新版swprintf其实是一个内联函数,在swprintf.inl文件中如下:
static __inline int swprintf(wchar_t * _String, size_t _Count, const wchar_t * _Format, ...)
{
va_list _Arglist;
int _Ret;
_crt_va_start(_Arglist, _Format);
_Ret = _vswprintf_c_l(_String, _Count, _Format, NULL, _Arglist);
_crt_va_end(_Arglist);
return _Ret;
}
看到这里,就恍然大悟了!!!
微软的程序员果然还真是聪明啊!!!这样既保证了软件兼容性,又可以实现兼容iso c99。
如果没猜错的话,目前所有版本的msvcrt.dll都是老版本的swprintf,所以才有今天mingw的头文件中swprintf的声明与iso c99不一致的问题。
那么要解决mingw中的swprintf问题,也好办了,可以学习微软的做法,修改wchar.h。