Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/visual-studio/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Visual studio visual studio swprintf正在使所有我的%s格式化程序都需要wchar\u t*而不是char*_Visual Studio_Printf - Fatal编程技术网

Visual studio visual studio swprintf正在使所有我的%s格式化程序都需要wchar\u t*而不是char*

Visual studio visual studio swprintf正在使所有我的%s格式化程序都需要wchar\u t*而不是char*,visual-studio,printf,Visual Studio,Printf,我有一个多平台项目,它在mac上编译得非常好,但在windows上,我所有的swprintf调用都使用%s来寻找wchar\u t,而不是char*im传递它。原来M$认为在宽字符函数中使%s代表除char*以外的其他字符会很有趣 无论如何,我正在寻找一种创造性的编码技巧,它比在每个宽字符串调用周围放置ifdef-else结尾要好使用%ls格式,它总是意味着wchar\u t*更新:VS 2015 CTP6恢复了这些更改,微软的行为再次与标准不同 除非定义了\u CRT\u STDIO\u L

我有一个多平台项目,它在mac上编译得非常好,但在windows上,我所有的swprintf调用都使用%s来寻找wchar\u t,而不是char*im传递它。原来M$认为在宽字符函数中使%s代表除char*以外的其他字符会很有趣


无论如何,我正在寻找一种创造性的编码技巧,它比在每个宽字符串调用周围放置ifdef-else结尾要好

使用
%ls
格式,它总是意味着
wchar\u t*

更新:VS 2015 CTP6恢复了这些更改,微软的行为再次与标准不同


除非定义了
\u CRT\u STDIO\u LEGACY\u WIDE\u说明符,否则以后将始终将
%s
视为窄字符串(
char*
)。它还添加了T长度修改器扩展,该扩展映射到MS所称的“自然”宽度。对于
sprintf
%Ts
char*
,对于
swprintf
%Ts
wchar\u 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\u t
%hs
%hc
始终是
char
。(为VS2003和VC6编写了文档(不确定
%ws
以及它真正添加的时间))

%s
映射到函数的自然宽度在Win9x与WinNT的时代非常方便,通过使用,您可以从同一源代码构建窄版本和宽版本。当定义了
\u UNICODE
时,
tchar.h
中的函数映射到宽函数,并且
tchar
wchar\u t
,否则使用窄函数,
tchar
char

_tprintf(_T("%c %s\n"), _T('a'), _T("Bcd"));
Windows SDK头文件和其中存在的少数格式函数(wsprintf、wvsprintf、wnsprintf和wvnsprintf)使用了类似的约定,但它们由
UNICODE
TEXT
控制,而不是
\u UNICODE
\u T
\u TEXT
控制

如果要支持旧版Windows编译器,您可能有3种选择使多平台项目在Windows上工作:

1)在Windows上作为窄字符串项目编译,可能不是一个好主意,在您的情况下,swprintf仍将%s视为wchar\u 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");
3)创建您自己的swprintf自定义版本,并将其与Visual Studio 13及更早版本一起使用。

您可以使用“%Ts”格式说明符,也可以定义_CRT_STDIO_LEGACY_WIDE_说明符=1

请阅读以下内容:


这不是将wchar\u t视为char*的问题,而是将char*视为wchar\u t的问题。另外,我认为%ls在旧的视觉工作室上不起作用。。。无论如何,谢谢neil。对不起,我找不到一种兼容的方法来指定
char*
,但我实际上在VS7.1文档中查找了%ls,所以这是一段很长的路。是的,我可以确认%ls至少在VS2008上起作用,这就是我正在使用的,谢谢。我也在文档中找到了它,很明显,我应该一直使用它而不是%S,因为我猜%S是非常不标准的东西。但实际上还有什么比使%s等于wchar\t更不标准的呢。我唯一想到的是将我所有的wprint重定向到一个包装器函数,我可以编写该函数,根据需要更改%s。我真的不知道如何使用它,在我的测试中,当定义或未定义_UNICODE时,行为是相同的swprintf%s需要一个wchar而不是char*。至于MS扩展,您知道是否有办法让gcc使用它们吗?您确定您的环境没有为您定义它(在VS的项目设置中)?如果你说的gcc是指MinGW,那么是的,MinGW可以使用MS C运行时,请参阅mac上的no gcc。。。在项目设置中,指定字符类型为“未定义”或“使用unicode”或“使用多字节”。如果您说“未定义”,则未定义UNICODE,如果您说“使用UNICODE”,则定义UNICODE。您可能只会在windows平台上找到对%hs和%ls的支持,为了保持可移植性,您可以为像inttypes这样的字符串编写自己的PRN定义。如果您想避免ifdef的话,h可以为数字定义。我不知怎的错过了您所说的swprintf,swprintf是宽版本,不管定义是什么,sprintf是窄版本,而stprintf(tchar.h)取决于定义。假设您的目的地是wchar*问题没有改变,您将需要MS特定的格式字符串。。。