c++ - 在一个项目中以 wchar_t 模式和普通模式使用 pugixml

标签 c++ xml pugixml

我有一个包含许多 .cpp 文件的项目。在其中一些文件中,我需要在 wchar_t 模式下使用 pugixml,其中一些已经在通常模式下使用 char 和 pugixml 实现。 我知道我必须使用定义

#define PUGIXML_WCHAR_MODE

当我尝试在使用 wchar_t 模式的文件中这样做时:

#define PUGIXML_WCHAR_MODE
*some code*
#undef

它给我链接错误。我做错了什么?

最佳答案

pugixml 并非设计为以这种方式工作。理想情况下,您可以尝试更改代码以使用一种编译标志组合(执行 UTF-8 <-> wchar_t 转换的函数,pugi::as_utf8 和 pugi::as_wide,可能会有所帮助)。

有一种不受支持的方法应该可以工作,但不是特别漂亮 - 您可以为 wchar 配置重命名 pugi 命名空间。

为此,您必须创建一个特殊的 header ,即 pugixmlw.hpp,您将在宽字符配置中包含该 header ;这个header内容应该大致如下:

#ifndef HEADER_PUGIXMLW_HPP
#define HEADER_PUGIXMLW_HPP

#define PUGIXML_WCHAR_MODE
#define pugi pugiw

#undef HEADER_PUGIXML_HPP
#undef HEADER_PUGICONFIG_HPP
#undef SOURCE_PUGIXML_CPP

#undef PUGIXML_TEXT
#undef PUGIXML_CHAR

#include "pugixml.hpp"

#undef PUGIXML_TEXT
#undef PUGIXML_CHAR

#undef HEADER_PUGIXML_HPP
#undef HEADER_PUGICONFIG_HPP
#undef SOURCE_PUGIXML_CPP

#undef pugi
#undef PUGIXML_WCHAR_MODE

#endif

如果您使用的是仅 header 的 pugixml 变体,那应该是它;如果您正在编译 pugixml.cpp,则必须添加一个额外的源文件 pugixmlw.cpp,其内容如下:

#define PUGIXML_WCHAR_MODE    
#define pugi pugiw
#include "pugixml.cpp"

应该是这样吧。

关于c++ - 在一个项目中以 wchar_t 模式和普通模式使用 pugixml,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14329075/

相关文章:

c++ - 两个类中的循环依赖 - 代码无法编译

c++ - 在 C++ 中创建不可复制但可移动的对象

C++ 打包 typedef 枚举

c++ - PugiXML C++ 换行符处理问题 : '\n\n' becomes '\\n\\n'

c++ - 在函数参数未定义行为中使用赋值运算符吗?

java - 线性布局发现意外的命名空间前缀 "xmlns"

PHP while循环生成KML文件

c++ - 无法使用 node.value() 获取 pugixml 中 XML 元素的值

c++ - pugixml:找出 xpath 是否与特定节点/属性匹配

xml - SonarQube - 将现有的 checkstyle xml 文件导入 SonarQube 失败