std::size_t与Fpdfview::size_t存在歧义,能否同时使用Excel和PDFium组件?
解决std::size_t与Fpdfview::size_t的编译歧义问题
你遇到的是命名空间导致的标识符冲突,完全可以同时使用这两个组件,以下是可行的解决思路:
问题原因
PDFium的Fpdfview命名空间中定义了自定义的size_t类型,和标准库std命名空间下的size_t产生冲突,编译器无法确定TPtrBase::operator new中的size_t应该引用哪一个。
解决方法
1. 隔离PDFium的命名空间
修改头文件包含方式,将PDFium的头文件包裹在其自身命名空间内,避免污染全局命名空间:
#include <vcl.h> #pragma hdrstop // 先包含Excel相关头文件 #include "Excel_2K_SRVR.h" // 用命名空间包裹PDFium头文件 namespace Fpdfview { #include "PDFium.hpp" } #include "Unit1.h" //--------------------------------------------------------------------------- #pragma package(smart_init) #pragma link "PDFium" #pragma link "Excel_2K_SRVR" #pragma resource "*.dfm" TForm1 *Form1;
后续使用PDFium组件时,需要显式添加Fpdfview::前缀(比如Fpdfview::FPDF_InitLibrary())。
2. 提前指定默认size_t的命名空间
在包含PDFium头文件前,显式声明使用标准库的size_t,让编译器优先识别:
#include <vcl.h> #pragma hdrstop // 提前指定使用std的size_t using std::size_t; // 再依次包含头文件 #include "PDFium.hpp" #include "Excel_2K_SRVR.h" #include "Unit1.h" //--------------------------------------------------------------------------- #pragma package(smart_init) #pragma link "PDFium" #pragma link "Excel_2K_SRVR" #pragma resource "*.dfm" TForm1 *Form1;
注意:这种方式需要确保PDFium内部代码不会依赖自身的size_t,如果有冲突,优先选择第一种方法。
3. 利用PDFium的编译宏(若支持)
检查PDFium的头文件,看是否提供了禁用全局size_t的编译宏(例如PDFIUM_NO_GLOBAL_TYPES之类的定义),在项目编译选项中添加该宏,即可避免命名冲突。
内容的提问来源于stack exchange,提问作者Jacek
相关产品推荐
相关产品推荐

