错误:多个文件中的结构声明冲突


//a.cpp has following code
#include "c.h"
extern "C" {
extern const ABC abc_table[];
}
//b.h has
const ABC abc_table[] = {.....};
//c.h has
#include "b.h"
typedef struct {.....} ABC;

该代码在visualstudio中编译良好

在Linux中,它给出以下错误

a.cpp:79:79: error: conflicting declaration of ‘const ABC abc_table []’ with ‘C’ linkage
extern const ABC abc_table[];
        ^
In file included from c.h:4:0, from a.cpp:31:
b.h:147:1: note: previous declaration with ‘C++’ linkage
abc_table [] =

我如何才能消除这个错误,以及为什么它在windows和linux 中不同

您的程序格式不正确。

[dcl.link](强调矿)

5如果两个声明声明具有相同名称的函数,并且参数类型列表为同一命名空间的成员或声明具有相同名称的对象是同一命名空间的成员,并且声明为名称提供了不同的语言链接,程序格式错误;如果出现声明,则不需要诊断以不同的翻译单位。除了具有C++链接的功能外,没有链接规范的函数声明不应在该函数的第一个链接规范之前。一个函数可以在显式已看到链接规范;明确指定的链接在早期声明中不受此函数的影响公告

无论在哪里包含a.hb.h,都会得到abc_table声明的冲突语言链接规范。与函数不同,变量必须显式匹配。

删除a.h中的链接规范,或将其添加到b.h中。尽管您遇到了b.h定义具有内部链接的对象名称的问题(由于const),所以找不到该符号。

我会一起放弃b.h中的声明。标头中的对象定义应保持在最低限度,尤其是在打算与C代码接口的情况下。

最新更新