问题描述
我正在寻找在 Visual Studio 中没有任何警告的情况下将 PCHAR* 变量转换为 TCHAR* 的方法(这是必需的)? 在线查看我找不到没有警告的功能或方法。也许有人遇到过类似的事情?
谢谢!
解决方法
将 PCHAR*
变量转换为 TCHAR*
在这两种情况下,您都不能(安全地)在 char **
和简单字符指针之间进行转换,因此以下假设问题实际上是关于将 PCHAR
转换为 TCHAR*
。
PCHAR
与 ANSI 构建中的 TCHAR*
相同,在这种情况下不需要转换,因此可以进一步假设问题与 Unicode 构建有关。
PCHAR 来自函数声明(不可更改),TCHAR 来自 GetCurrentDirectory。我想使用 _tcscat_s 连接 2,但我需要先转换 PCHAR。
窄字符串和宽字符串之间转换的一般问题之前已经回答过,例如参见 Convert char * to LPWSTR 或 How to convert char* to LPCWSTR?。但是,在这种特殊情况下,您可以在选择一般方法之前权衡备选方案。
-
将您的构建设置更改为 ANSI,而不是 Unicode,则无需转换。
这就像确保编译时既没有定义UNICODE
也没有定义_UNICODE
宏一样简单,或者在 IDE 中更改项目配置属性/高级/字符集 从 Use Unicode Character Set 到 Not Set 或 Use Multi-Byte Character Set。
免责声明:如今针对 8 位 Windows 代码页进行编译是一种逆行。我不建议它,这样做意味着许多国际字符无法按字面表示。但是,链的强度取决于其最薄弱的环节,如果您被迫使用无法更改的外部函数返回的窄字符串,那么这就限制了在其他地方使用完整 Unicode 的用处。 -
将构建保留为 Unicode,但只更改连接代码以使用 ANSI 字符串。
这可以通过显式调用 API 的 ANSI 版本GetCurrentDirectoryA
来完成,该版本返回一个窄字符串。然后你可以直接用另一个strcat
字符串PCHAR
。 -
保持原样,但使用
[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