swprintf declaration mismatch
我在Windows(gcc版本4.8.1)上使用MinGW g编译器,并且对swprintf声明感到困惑
根据此参考文献,应为
1
| int swprintf (wchar_t* ws, size_t len, const wchar_t* format, ...); |
但是当我使用
1
| swprintf(my_ws, 32, L"hello"); |
我得到错误
1
| initializing argument 2 of 'int swprintf(wchar_t*, const wchar_t*, ...)' [-fpermissive] |
看起来像size_t len不在声明中。参考是否有误,我是否错过了某件事,或者背后有故事吗?
- 您正在使用哪个mingw版本?
-
gcc版本是4.8.1
-
尝试在编译器开关中定义USE_MINGW_ANSI_STDIO(例如-DUSE_MINGW_ANSI_STDIO)
-
port70.net/~nsz/c/c11/n1570.html#7.29.2.3
您正在使用不符合C99标准的C库。
MinGW是使用Microsoft C运行时库的gcc端口。
Microsoft在标准化为C99之前拥有自己的swprintf版本,带有不同的原型。这是一个非常老的C库,具有很多C99不兼容性,例如,我认为它的printf不支持%zu for size_t ...
如果MinGW使用更新的运行时,则应升级到更新的版本。如果没有,您将不得不使用旧的原型,并使用这些过时的API。
- mingw不是Visual Studio吗? Mingw不使用gcc;#47;g++吗?
-
我了解这一点,但是MinGW使用了其编译器随附的Microsoft C库。
-
mingw将Visual C运行时用于其库实现...具有旧的非标准参数的非常旧的msvcrt.dll。 (嗯,实际上msvcrt.dll太旧了,但是它与MSVC 6.0向下兼容,所以...)
-
特别是,赢得了msvc140.dll(或任何名称)附带的新Visual Studio;#39; t对mingw没有任何影响,而mingw继续使用msvcrt.dll
-
@BenVoigt:您是对的,我更新了我的答案。希望MinGW最终将支持更新的C运行时,因为Microsoft似乎终于接近C99了。
-
如果使用msvcrt.dll,是否表示代码不可移植?
-
@JanTuro?#39;恐怕您是正确的,这方面的代码无法移植到其他环境中。您是使用Windows API编程还是仅使用标准C API或可能使用POSIX进行编程。如果您没有专门针对Windows,则应安装<; cod>; cygwi <; / cod>;。它带有一个更新的C运行时。
-
更有理由使用MinGW-w64,而不是旧的废弃软件mingw
-
@ M.M:好的,所以mingw-w64不相信使用msvcrt.dll会使用哪个库?
-
@BenVoigt我认为大多数功能仍然使用msvcrt.dll,但是提供了自己的swprintf等与C99兼容的版本。