如何将使用 tchar.h 处理 unicode 的 Windows C++ 移植到 iOS 应用程序
How to port Windows C++ that handles unicode with tchar.h to iOS app
我有一些 C++ 代码需要集成到 iOS 应用程序中。 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。有人知道应该怎么做吗?
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 );
这可能是您收到 "wrong arguments" 错误的原因。
我有一些 C++ 代码需要集成到 iOS 应用程序中。 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。有人知道应该怎么做吗?
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 );
这可能是您收到 "wrong arguments" 错误的原因。