C++如何创建全局函数指针数组 避免多重定义错误
C++全局函数指针数组多重定义问题解决方案
错误原因
C与C++对全局变量的默认链接规则存在差异:
- C语言中未显式初始化的全局变量属于暂定定义(tentative definition),多个编译单元的同名定义会在链接阶段合并,所以你原来的写法可以正常运行
- C++没有暂定定义规则,你直接在头文件中定义
f_t Fs[2] = {f,g};时,每个包含该头文件的编译单元(f.cpp、g.cpp、main.cpp)都会生成独立的Fs符号,链接时就会触发多重定义错误
可用解决方案
方案1:使用inline关键字(C++17及以上推荐)
inline变量在C++17中被正式引入,允许在多个编译单元重复定义,链接时只会保留唯一实例,修改头文件中数组的定义即可,不需要额外调整其他代码:
// head.h 中修改数组定义行 inline f_t Fs[2] = {f,g};
方案2:使用extern声明+单独定义(兼容所有C++版本)
头文件中只保留数组的extern声明,将定义放到任意一个cpp文件中,避免重复生成符号:
// head.h 中修改为声明 extern f_t Fs[2];
// 任意一个cpp中添加定义,比如main.cpp #include "head.h" f_t Fs[2] = {f,g}; int main() { Fs[0](); }
方案3:添加const修饰符(数组不需要修改时使用)
const修饰的全局变量默认是内部链接属性,每个编译单元的同名const变量不会导出全局符号,不会触发冲突:
// head.h 中修改数组定义 const f_t Fs[2] = {f,g};
你之前单独把数组放到头文件还报错,就是因为没有加const修饰,加上即可解决问题。
内容的提问来源于stack exchange,提问作者Vadim Kashtanov
相关产品推荐
相关产品推荐

