如何在 windows 和 linux 上使用相同的宽字符字符串格式
Posted
技术标签:
【中文标题】如何在 windows 和 linux 上使用相同的宽字符字符串格式【英文标题】:How to use same wide char string format for windows and linux 【发布时间】:2015-03-24 11:56:59 【问题描述】:目前,我有一些可以在 Windows/Linux 上运行的代码。现在输出一些信息时出现问题。 在 Windows 上,我使用 _vsnwprintf_s() 来支持可变参数。所以它支持以下格式。
Log0(L"111");
Log1(L"%s", L"22");
Log2(L"%s, %d", L"33", 44);
在 Linux 上,我不能使用 vswprintf 来格式化字符串,但它需要使用 %ls
来格式化宽字符串。
Debug0(L"111");
Debug1(L"%ls", L"22");
目前,我想封装一个统一的函数 InfoX() 以支持跨平台,因此它内部将根据当前操作系统类型使用 LogX() 或 DebugX()。 如您所见,在 Windows 上,我将使用 %s 来格式化宽字符串,但在 linux 上将使用 %ls。我不知道如何在 Info2() 函数中的 ??? 处输入。
Info2(L"???", L"22");
【问题讨论】:
您是使用 C++ 编译器还是 C 编译器编译代码?我认为您应该指定 c++ 标签或 c 标签,而不是两者。 我用的是g++,我会更新tag。 你不是说swprintf
吗?你没有传递va_list
。
根据Microsoft,%ls
说明符需要一个宽字符字符串:“ls
、lS
、ws
或 wS
类型说明符与 @987654333 同义@ 在 printf 函数中,s
在 wprintf 函数中。"所以你可以在 Linux 和 Windows 上使用%ls
。 (%S
的格式似乎是非标准的,在两个平台上都不一样。)
【参考方案1】:
你为什么不使用 stl 库?它是回答您的问题的更好工具。 您使用宽字符,因此 std::wstring 是最佳解决方案。 要创建您的“wstring”值,您可以使用“wstringstream”并且您不需要格式化您的字符。
#include <sstream>
#include <iostream>
void LOG(std::wstring _sLog)
std::wcout << _sLog << '\n';
//Your LOG code
int main()
std::wstringstream oss;
std::wstring wideValue(L"my wide value :");
oss << wideValue << 101;
std::wstring s = oss.str();
LOG(s);
return 0;
【讨论】:
以上是关于如何在 windows 和 linux 上使用相同的宽字符字符串格式的主要内容,如果未能解决你的问题,请参考以下文章
如何在 windows 和 linux 上使用相同的宽字符字符串格式
如何在带有 Tortoise git 的 Windows 上使用 linux 生成的密钥?
在 Linux 上显示当前分支和着色(如 Windows 上的 Git Bash)
Webfonts 在 Windows、Mac 和 Linux 上呈现不同