visual studio swprintf让我所有的%s格式化程序都需要wchar_t *而不是char *

时间:2012-04-03 20:17:23

标签: visual-studio printf

我有一个可以在mac上编译的多平台项目,但在Windows上,所有带有%s的swprintf调用都在寻找wchar_t而不是传递它的char * im。结果M $认为让%s代表广泛字符函数中除char *以外的东西会很有趣...... http://msdn.microsoft.com/en-us/library/hf4y5e3w.aspx

无论如何我正在寻找一种创造性的编码技巧,比把ifdef以每个宽字符串调用结束更好

3 个答案:

答案 0 :(得分:4)

除非您定义%s,否则

Visual Studio 14 CTP1及更高版本将始终将char*视为一个较窄的字符串(_CRT_STDIO_LEGACY_WIDE_SPECIFIERS)。它还添加了T长度修改器扩展,它映射到MS称为“自然”宽度。 sprintf %Tschar*,而swprintf %Tswchar_t*


在Visual Studio 13及更早版本中,%s / %c映射到函数/格式字符串的自然宽度,而%S / %C映射到相反的天然的:

printf("%c %C %s %S\n", 'a', L'B', "cd", L"EF");
wprintf(L"%c %C %s %S\n", L'a', 'B', L"cd", "EF");

您还可以使用长度修改器强制特定宽度:%ls%lc%ws%wc始终表示wchar_t和{{1 }}和%hs始终为%hc。 (记录为VS2003 here和VC6 here(不确定char以及何时真正添加)

在Win9x与WinNT的时代,将%ws映射到函数的自然宽度非常方便,使用tchar.h header可以从同一个源构建窄版和宽版。定义%s后,_UNICODE中的函数映射到宽函数,tchar.h映射为TCHAR,否则使用窄函数,wchar_t为{{1} }}:

TCHAR

Windows SDK头文件使用的类似约定和那里存在的少数格式函数(wsprintf,wvsprintf,wnsprintf和wvnsprintf)但它们由char_tprintf(_T("%c %s\n"), _T('a'), _T("Bcd")); 控制而不是UNICODETEXT / _UNICODE

如果您想支持较旧的Windows编译器,您可能有3种选择使多平台项目在Windows上运行:

1)在Windows上编译为一个窄字符串项目,可能不是一个好主意,在您的情况下,swprintf仍会将%s视为wchar_t *。

2)使用类似于inttypes.h格式字符串工作的自定义定义:

_T

3)创建自己的swprintf自定义版本,并将其与Visual Studio 13及更早版本一起使用。

答案 1 :(得分:2)

使用始终为%ls的{​​{1}}格式。

答案 2 :(得分:2)

您可以使用"%Ts"格式说明符或您可以定义_CRT_STDIO_LEGACY_WIDE_SPECIFIERS = 1.

阅读本文:

http://blogs.msdn.com/b/vcblog/archive/2014/06/18/crt-features-fixes-and-breaking-changes-in-visual-studio-14-ctp1.aspx