使用C++可变长度args时如何从_TCHAR*转换为char*?

Nic*_*ton 8 c++ char tchar

我们需要将一个格式_TCHAR*字符串和一些char*字符串传递给一个带有可变长度args的函数:

inline void FooBar(const _TCHAR *szFmt, const char *cArgs, ...) {
  //...
}
Run Code Online (Sandbox Code Playgroud)

所以它可以这样调用:

char *foo = "foo";
char *bar = "bar";
LogToFileA(_T("Test %s %s"), foo, bar);
Run Code Online (Sandbox Code Playgroud)

显然,一个简单的解决方法是使用_TCHAR而不是char,但遗憾的是我们并没有那么奢侈.

我们需要将它与va_start等一起使用,以便我们可以格式化一个字符串:

va_list args;
_TCHAR szBuf[BUFFER_MED_SIZE];

va_start(args, cArgs);
_vstprintf_s(szBuf, BUFFER_MED_SIZE, szFmt, args);
va_end(args);
Run Code Online (Sandbox Code Playgroud)

不幸的是我们不能使用它,因为它给了我们这个错误:

Unhandled exception at 0x6a0d7f4f (msvcr90d.dll) in foobar.exe:
0xC0000005: Access violation reading location 0x2d86fead.
Run Code Online (Sandbox Code Playgroud)

我想我们需要将我们的char*转换为_TCHAR* - 但是如何?

Rem*_*eau 3

使用 %hs 或 %hS 代替 %s。这将强制参数在 printf() 样式函数的 Ansi 和 Unicode 版本中被解释为 char*,即:

inline void LogToFile(const _TCHAR *szFmt, ...)
{  
  va_list args;
  TCHAR szBuf[BUFFER_MED_SIZE];

  va_start(args, szFmt);
  _vstprintf_s(szBuf, BUFFER_MED_SIZE, szFmt, args);
  va_end(args);
}  

{
  char *foo = "foo"; 
  char *bar = "bar"; 
  LogToFile(_T("Test %hs %hs"), foo, bar); 
}
Run Code Online (Sandbox Code Playgroud)