如何将使用 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 运行时是 _TCHAR
,TCHAR
用于 Win32 API)是允许代码在编译时在 char
或 wchar_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 应用程序的主要内容,如果未能解决你的问题,请参考以下文章