是否有一个格式说明符总是表示带有_tprintf的字符串



当您使用TCHAR支持在Windows上构建应用程序时,_tprintf()中的%s意味着Ansi构建的char *字符串和Unicode构建的wchar_t *,而%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:%sn"),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_ASCIISTRPF_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")); }

最新更新