解决使用ptlib库编译"realloc"参数不足问题

解决使用ptlib库导致的编译错误qlist.h(98): warning C4003: 类函数宏的调用“realloc”参数不足的问题。

编译错误

D:\Qt\Qt5.12.1\5.12.1\msvc2017\include\QtCore/qlist.h(98): warning C4003: 类函数宏的调用“realloc”参数不足
D:\Qt\Qt5.12.1\5.12.1\msvc2017\include\QtCore/qlist.h(98): error C2059: 语法错误:“,”
D:\Qt\Qt5.12.1\5.12.1\msvc2017\include\QtCore/qlist.h(98): error C3254: “QListData”: 类包含显式重写“Reallocate”,但并不从包含函数声明的接口派生
D:\Qt\Qt5.12.1\5.12.1\msvc2017\include\QtCore/qlist.h(98): error C2838: “Reallocate”: 成员声明中的限定名称非法
D:\Qt\Qt5.12.1\5.12.1\msvc2017\include\QtCore/qlist.h(577): warning C4003: 类函数宏的调用“realloc”参数不足
D:\Qt\Qt5.12.1\5.12.1\msvc2017\include\QtCore/qvarlengtharray.h(244): error C2059: 语法错误:“字符串”
D:\Qt\Qt5.12.1\5.12.1\msvc2017\include\QtCore/qvarlengtharray.h(260): note: 参见对正在编译的 类 模板 实例化 "QVarLengthArray" 的引用
D:\Qt\Qt5.12.1\5.12.1\msvc2017\include\QtCore/qvarlengtharray.h(244): error C3254: “QVarLengthArray”: 类包含显式重写“Reallocate”,但并不从包含函数声明的接口派生
D:\Qt\Qt5.12.1\5.12.1\msvc2017\include\QtCore/qvarlengtharray.h(244): error C2838: “Reallocate”: 成员声明中的限定名称非法
D:\Qt\Qt5.12.1\5.12.1\msvc2017\include\QtCore/qvarlengtharray.h(362): warning C4346: “QVarLengthArray::PMemoryHeap::Reallocate”: 依赖名称不是类型
D:\Qt\Qt5.12.1\5.12.1\msvc2017\include\QtCore/qvarlengtharray.h(362): note: 用“typename”为前缀来表示类型
D:\Qt\Qt5.12.1\5.12.1\msvc2017\include\QtCore/qvarlengtharray.h(362): error C2988: 不可识别的模板声明/定义
D:\Qt\Qt5.12.1\5.12.1\msvc2017\include\QtCore/qvarlengtharray.h(362): error C2059: 语法错误:“字符串”
D:\Qt\Qt5.12.1\5.12.1\msvc2017\include\QtCore/qvarlengtharray.h(363): error C2063: “Reallocate”: 不是一个函数
D:\Qt\Qt5.12.1\5.12.1\msvc2017\include\QtCore/qvarlengtharray.h(363): error C2226: 语法错误: 意外的“QVarLengthArray::PMemoryHeap::Reallocate”类型

问题分析

  • 由于使用了ptlib库编译,编译错误又提示类函数宏的调用“realloc”参数不足的问题,就查找了一下ptlib关于realloc的接口;
  • 找到ptlib下的object.h头文件包含以下宏定义;
/** Override of system call for memory check system.
This macro is used to allocate memory via the memory check system selected
with the PMEMORY_CHECK compile time option. It will include the source file
and line into the memory allocation to allow the PMemoryHeap class to keep
track of the memory block.
*/
#define realloc(p,s) PMemoryHeap::Reallocate(p, s, __FILE__, __LINE__)

解决问题

  • 在引用ptlib的头文件下使用使用undef宏定义解开realloc即可解决。
#undef realloc(p,s)

关于编译器C2838与C3254的错误代码

  • C3254为"explicit override"类包含显式重写"override",但并不从包含函数声明的接口派生;
  • C2838为类、结构或联合使用完全限定名重新声明另一个类、结构或联合的成员。

你可能感兴趣的:(C,C++)