关于mingw里面swprintf函数的问题

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq446252221/article/details/81259738

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。

猜你喜欢

转载自blog.csdn.net/qq446252221/article/details/81259738