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

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

编译错误

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
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<T,Prealloc>" 的引用
D:\Qt\Qt5.12.1\5.12.1\msvc2017\include\QtCore/qvarlengtharray.h(244): error C3254: “QVarLengthArray<T,Prealloc>”: 类包含显式重写“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<T,Prealloc>::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<T,Prealloc>::PMemoryHeap::Reallocate”类型

问题分析

  • 由于使用了ptlib库编译,编译错误又提示类函数宏的调用“realloc”参数不足的问题,就查找了一下ptlib关于realloc的接口;
  • 找到ptlib下的object.h头文件包含以下宏定义;
    1
    2
    3
    4
    5
    6
    7
    /** Override of system call for memory check system.
    This macro is used to allocate memory via the memory check system selected
    with the <code>PMEMORY_CHECK</code> 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即可解决。
    1
    #undef realloc(p,s)

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

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