为什么 xerces 把 XMLCh 改成了 char16_t,我能改回 wchar_t 吗?

问题描述

我们一直在使用旧的、预先构建的 Xerces 3.1.1 版本,它具有:

3.1.1:Xerces_autoconf_config.hpp

#ifdef _NATIVE_WCHAR_T_DEFINED
#  define XERCES_XMLCH_T      wchar_t
#else
#  define XERCES_XMLCH_T      unsigned short
#endif
...
typedef XERCES_XMLCH_T              XMLCh;

转向使用 vcpkg 它已经安装了 3.2.3 并且我们有编译错误,因为它使用的是 wchar_t

3.2.3:Xerces_autoconf_config.hpp

#define XERCES_XMLCH_T char16_t
...
typedef XERCES_XMLCH_T              XMLCh;

我们有很多代码调用src.setEncoding(L"UTF-16");,这显然会导致错误,例如:

void xercesc_3_2::InputSource::setEncoding(const XMLCh *const )': 无法将参数 1 从“const wchar_t [7]”转换为“const XMLCh” *常量'

我不确定 Xerces 是否已更改,或者这是否是 vcpkg 的认构建设置的结果。是否可以将其恢复到 wchar_t(黑客来源除外),如果可以,如何恢复?不幸的是,我是一个彻头彻尾的 cmake 菜鸟。

解决方法

好的,根据xerces-c docs

XMLCh 类型(UTF-16 字符类型):

选项 说明
-Dxmlch-type=char16_t 使用 char16_t(需要 C++11 编译器)
-Dxmlch-type=uint16_t 如果标准类型不可用,请使用 uint16_t from 或 ,或其他无符号 16 位类型,例如 unsigned short
-Dxmlch-type=wchar_t 使用 wchar_t(仅限 Windows)

vcpkg中,这部分通过特性公开:

vcpkg install xerces-c[xmlch-wchar] XMLCh 类型使用 wchar_t

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...