作者热门文章
- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
-6ren">
我试过下面的代码:
wprintf(L"1 %s\n","some string"); //Good
wprintf(L"2 %s\n",L"some string"); //Not good -> print only first character of the string
printf("3 %s\n","some string"); //Good
//printf("4 %s\n",L"some string"); //Doesn't compile
printf("\n");
wprintf(L"1 %S\n","some string"); //Not good -> print some funny stuff
wprintf(L"2 %S\n",L"some string"); //Good
//printf("3 %S\n","some string"); //Doesn't compile
printf("4 %S\n",L"some string"); //Good
我得到以下输出:
1 some string
2 s
3 some string
1 g1 %s
2 some string
4 some string
因此:似乎 wprintf
和 printf
都能够正确打印 char* 和 wchar*,但前提是使用了确切的说明符。 如果使用了错误的说明符,您可能不会收到编译错误(也不会收到警告!)并以错误的行为结束。您是否遇到过相同的行为?
注意:这是在 Windows 下测试的,使用 MinGW 和 g++ 4.7.2 编译(我稍后会检查 gcc)
编辑:我也尝试了 %ls(结果在评论中)
printf("\n");
wprintf(L"1 %ls\n","some string"); //Not good -> print funny stuff
wprintf(L"2 %ls\n",L"some string"); //Good
// printf("3 %ls\n","some string"); //Doesn't compile
printf("4 %ls\n",L"some string"); //Good
最佳答案
我怀疑 GCC (mingw) 有自定义代码来禁用对 Windows 上广泛的 printf
函数的检查。这是因为 Microsoft 自己的实现 (MSVCRT) 严重错误并且有 %s
和 %ls
backwards广泛的 printf
函数;由于 GCC 无法确定您将链接到 MS 的损坏实现还是一些更正的实现,它可以做的最不引人注目的事情就是关闭警告。
关于c - printf、wprintf、%s、%S、%ls、char* 和 wchar* : Errors not announced by a compiler warning?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17700797/
我是一名优秀的程序员,十分优秀!