TCHAR
当您使用支持在 Windows 上构建应用程序时, %s
in_tprintf()
表示char *
Ansi 构建和wchar_t *
Unicode 构建的字符串,而%S
反之亦然。
char *
但是,无论是 Ansi 还是 Unicode 版本,是否有任何格式说明符始终表示字符串?由于即使在 Windows 上 UTF-16 也没有真正用于文件或网络,所以无论您将应用程序编译为何种本机字符类型,您仍然经常需要处理基于字节的字符串。
TCHAR
当您使用支持在 Windows 上构建应用程序时, %s
in_tprintf()
表示char *
Ansi 构建和wchar_t *
Unicode 构建的字符串,而%S
反之亦然。
char *
但是,无论是 Ansi 还是 Unicode 版本,是否有任何格式说明符始终表示字符串?由于即使在 Windows 上 UTF-16 也没有真正用于文件或网络,所以无论您将应用程序编译为何种本机字符类型,您仍然经常需要处理基于字节的字符串。
h
修饰符强制%s
和%S
到char*
,并且修饰符l
同时强制 到 wchar_t*
,即:%hs
、%hS
、%ls
和%lS
。
这也可能解决您的问题:
_TCHAR *message;
_tprintf(_T("\n>>>>>> %d") TEXT(" message is:%s\n"),4,message);
你可以很容易地写出这样的东西:
#ifdef _UNICODE
#define PF_ASCIISTR "%S"L
#define PF_UNICODESTR "%s"L
#else
#define PF_ASCIISTR "%s"
#define PF_UNICODESTR "%S"
#endif
然后在格式字符串中使用PF_ASCIISTR
orPF_UNICODESTR
宏,利用 C 自动字符串文字连接:
_tprintf(_T("There are %d ") PF_ASCIISTR _T(" over the table"), 10, "pens");
我发现,'_vsntprintf_s' 使用 '%s' 作为 TCHAR 类型并且适用于 GCC 和 MSVC。所以你可以像这样包装它:
int myprintf(const TCHAR* lpszFormat, va_list argptr) {
int len = _vsctprintf(lpszFormat, argptr); // -1:err
if (len<=0) {return len;}
auto* pT = new TCHAR[2 + size_t(len)];
_vsntprintf_s(pT, (2+len)*sizeof(TCHAR), 1+len, lpszFormat, argptr);
int rv = printf("%ls", pT);
delete[] pT;
return rv;
}
int myprintf(const TCHAR* lpszFormat, ...) {
va_list argptr;
va_start(argptr, lpszFormat);
int rv = myprintf(lpszFormat, argptr);
va_end(argptr);
return rv;
}
int main(int, char**) { return myprintf(_T("%s"), _T("Test")); }