如何将使用 tchar.h 处理 unicode 的 Windows C++ 移植到 iOS 应用程序

Posted

技术标签:

【中文标题】如何将使用 tchar.h 处理 unicode 的 Windows C++ 移植到 iOS 应用程序【英文标题】:How to port Windows C++ that handles unicode with tchar.h to iOS app 【发布时间】:2017-08-09 17:02:47 【问题描述】:

我有一些需要集成到 ios 应用程序中的 c++ 代码。 windows c++ 代码使用 tchar.h 处理 unicode。我为 iOS 做了以下定义:

#include <wchar.h>
#define _T(x)     x
#define TCHAR       char
#define _tremove    unlink
#define _stprintf   sprintf
#define _sntprintf vsnprintf
#define _tcsncpy wcsncpy
#define _tcscpy wcscpy
#define _tcscmp wcscmp
#define _tcsrchr wcsrchr
#define _tfopen fopen

在尝试构建应用程序时,其中许多参数要么丢失(例如 wcscpy),要么参数错误。负责 c++ 代码的编码人员说我应该使用 char 而不是 wchar,所以我将 TCHAR 定义为 char。有没有人知道这应该怎么做?

【问题讨论】:

【参考方案1】:

TCHAR(仅供参考,在 C 运行时是 _TCHARTCHAR 用于 Win32 API)是允许代码在编译时在 charwchar_t API 之间切换时间,但是您的定义将它们混合在一起。 wcs 函数用于 wchar_t,因此您需要将这些定义更改为 char 对应项,以匹配您的其他基于 char 的定义:

#define _tcsncpy strncpy
#define _tcscpy strcpy
#define _tcscmp strcmp
#define _tcsrchr strrchr

另外,您将_sntprintf 映射到错误的C 函数。需要映射到snprintf()而不是vsnprintf()

#define _sntprintf snprintf

snprintf()vsnprintf() 的声明方式非常不同:

int snprintf ( char * s, size_t n, const char * format, ... );
int vsnprintf (char * s, size_t n, const char * format, va_list arg );

这可能是您收到“错误参数”错误的原因。

【讨论】:

太棒了!仍然缺少#define _sntprintf vsnprintf 并且包括wchar.h 大概是没有必要的? 您将_sntprintf 映射到错误的函数。我更新了我的答案。 好的。现在我在以下行中得到“没有对 snprintf 的匹配函数调用”:_sntprintf( m_sErr, sizeof(m_sErr)/sizeof(m_sErr[0]), L"Tiedoston %s avaaminen ep\xE4onnistui.", pFileNimi ); 在第三个参数中将L"..." 更改为_T("...")。您正在传递 wchar_t* ,其中预期 char* 。并确保 pFileNimi 是基于 TCHAR 而不是基于 wchar_t,因此它与函数 _sntprintf 映射到的正确字符类型相匹配。 所以我可能必须为更改的行添加#ifdef macOS?

以上是关于如何将使用 tchar.h 处理 unicode 的 Windows C++ 移植到 iOS 应用程序的主要内容,如果未能解决你的问题,请参考以下文章

《windows程序设计》第一个窗口

C语言 TCHAR的字符串,怎么复制和比较?

CString构造函数

main()和_tmain()的区别

error:"LPSTR"类型的实参数与"LPCWSTR"类型的形参不兼容

char 转wchar_t 及wchar_t转char