0

我正在寻找将 PCHAR* 变量转换为 TCHAR* 的方法,而不会在 Visual Studio 中出现任何警告(这是一项要求)?在网上看,我找不到没有警告的功能或方法。也许有人遇到过类似的事情?

谢谢 !

4

1 回答 1

0

PCHAR*变量转换为TCHAR*

  • PCHAR是 一个typedef那 解决 到char*, 所以PCHAR*意味着char**.

  • TCHAR#define是“宽”wchar_t或“窄”的宏char

在这两种情况下,您都不能(安全地)在 achar **和简单字符指针之间进行转换,因此以下假设问题实际上是关于将 a 转换PCHAR为 a TCHAR*

PCHAR在 ANSI 构建中是相同TCHAR*的,在这种情况下不需要转换,因此可以进一步假设问题与 Unicode 构建有关。

PCHAR 来自函数声明(不能更改),TCHAR 来自 GetCurrentDirectory。我想使用 _tcscat_s 连接 2,但我需要先转换 PCHAR。

之前已经回答了在窄字符串和宽字符串之间转换的一般问题,例如,请参阅将 char * 转换为 LPWSTR如何将 char* 转换为 LPCWSTR?. 但是,在这种特殊情况下,您可以在选择通用方法之前权衡备选方案。

  1. 将您的构建设置更改为 ANSI,而不是 Unicode,则无需转换。

    这就像确保在编译时既不定义UNICODE也不_UNICODE定义宏一样简单,或者在 IDE 中将项目Configuration Properties / Advanced / Character SetUse Unicode Character Set更改为Not SetUse Multi-Byte Character Set

    免责声明:如今,针对 8 位 Windows 代码页进行编译是一种逆行。我建议这样做,这样做意味着许多国际字符无法按字面表示。然而,一条链条的强度取决于它最薄弱的一环,如果你被迫使用您无法更改的外部函数返回的窄字符串,那么这就限制了在其他地方使用完整 Unicode 的有用性。

  2. 将构建保持为 Unicode,但仅更改连接代码以使用 ANSI 字符串。

    这可以通过显式调用 API 的 ANSI 版本来完成GetCurrentDirectoryA,该 API 返回一个窄字符串。然后你可以strcat直接用另一个PCHAR字符串。

  3. 保持原样,但使用[w]printf而不是组合窄和宽字符串_tcscat_s

    char szFile[] = "test.txt";
    PCHAR pszFile = szFile;                           // narrow string from ext function
    
    wchar_t wszDir[_MAX_PATH];
    GetCurrentDirectoryW(_MAX_PATH, wszDir);          // wide string from own code
    
    wchar_t wszPath[_MAX_PATH];
    wsprintf(wszPath, L"%ws\\%hs", wszDir, pszFile);  // combined into wide string
    
    
于 2020-12-30T03:55:01.577 回答