TCHAR当您使用支持在 Windows 上构建应用程序时, %sin_tprintf()表示char *Ansi 构建和wchar_t *Unicode 构建的字符串,而%S反之亦然。
char *但是,无论是 Ansi 还是 Unicode 版本,是否有任何格式说明符始终表示字符串?由于即使在 Windows 上 UTF-16 也没有真正用于文件或网络,所以无论您将应用程序编译为何种本机字符类型,您仍然经常需要处理基于字节的字符串。
TCHAR当您使用支持在 Windows 上构建应用程序时, %sin_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_ASCIISTRorPF_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")); }