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