【问题标题】:How to port Windows C++ that handles unicode with tchar.h to iOS app如何将使用 tchar.h 处理 unicode 的 Windows C++ 移植到 iOS 应用程序
【发布时间】: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。有没有人知道这应该怎么做?

【问题讨论】:

    标签: c++ ios winapi unicode tchar


    【解决方案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?
    猜你喜欢
    • 1970-01-01
    • 2014-05-28
    • 2011-02-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多