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

时间:2019-02-06 08:25:01

标签: c++ c

//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;

此代码在Visual Studio中可以正常编译

在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中与众不同

1 个答案:

答案 0 :(得分:0)

您的程序格式错误。

  

[dcl.link] (强调我的意思)

     

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

无论您同时包含a.hb.h都是关于abc_table声明的语言链接规范。与函数不同,变量必须显式匹配。

要么在a.h中删除链接规范,要么在b.h中添加它。虽然然后您遇到了b.h用内部链接定义对象名称的问题(由于const),所以找不到该符号。

我将一起放弃b.h中的声明。标头中的对象定义应尽量减少,特别是如果要与C代码进行接口的话。