Med*_*ran 5 printf visual-studio
我有一个多平台项目,在mac上编译很好,但在Windows上我所有的带有%s的swprintf调用都在寻找一个wchar_t而不是传递它的char*im.事实证明M $认为让%s代表除了广角字符函数中的字符以外的东西会很有趣... http://msdn.microsoft.com/en-us/library/hf4y5e3w.aspx
无论如何,我正在寻找一种创造性的编码技巧,比将ifdef以每个宽字符串调用结束更好
更新:VS 2015 CTP6 恢复了更改,Microsoft 的行为再次与标准不同。
Visual Studio 14 CTP1 及更高版本将始终将其视为%s窄字符串 ( char*),除非您定义了_CRT_STDIO_LEGACY_WIDE_SPECIFIERS. 它还添加了 T 长度修饰符扩展,该扩展映射到 MS 所谓的“自然”宽度。对于sprintf %Tsischar*和对于swprintf %Tsis wchar_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");
Run Code Online (Sandbox Code Playgroud)
您还可以使用长度修饰符强制指定宽度:%ls、%lc、%ws和%wc总是 意味着wchar_t和%hs和%hc总是char。(这里记录了VS2003,这里记录了VC6 (不确定%ws它是什么时候添加的))
%s在 Win9x 与 WinNT 时代,映射到函数的自然宽度确实很方便,通过使用tchar.h标头,您可以从同一源构建窄版本和宽版本。当_UNICODE定义 时, 中的函数tchar.h映射到宽函数 和TCHAR,wchar_t否则使用窄函数TCHAR和char:
_tprintf(_T("%c %s\n"), _T('a'), _T("Bcd"));
Run Code Online (Sandbox Code Playgroud)
Windows SDK 头文件和其中存在的少数格式函数(wsprintf、wvsprintf、wnsprintf 和 wvnsprintf)使用类似的约定,但它们由 and 控制,而UNICODE不是TEXT和_UNICODE/_T控制_TEXT。
如果您想支持较旧的 Windows 编译器,您可能有 3 个选择来使多平台项目在 Windows 上运行:
1)在 Windows 上编译为窄字符串项目,可能不是一个好主意,在您的情况下 swprintf 仍会将 %s 视为 wchar_t*。
2)使用类似于 inttypes.h 格式字符串工作方式的自定义定义:
#ifdef _WIN32
#define PRIs "s"
#define WPRIs L"hs"
#else
#define PRIs "s"
#define WPRIs L"s"
#endif
printf("%" PRIs " World\n", "Hello");
wprintf(L"%" WPRIs L" World\n", "Hello");
Run Code Online (Sandbox Code Playgroud)
3)创建您自己的自定义版本的 swprintf 并将其与 Visual Studio 13 及更早版本一起使用。
| 归档时间: |
|
| 查看次数: |
5023 次 |
| 最近记录: |