//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中与众不同
答案 0 :(得分:0)
您的程序格式错误。
[dcl.link] (强调我的意思)
5如果两个声明以相同的名称声明函数,并且 parameter-type-list成为同一名称空间的成员或声明 具有相同名称的对象成为相同名称空间的成员,并且 声明为名称提供了不同的语言链接,程序 格式错误;如果出现声明,则不需要诊断 在不同的翻译单位中。除了具有C ++链接的功能外, 没有链接规范的功能声明不应 在该功能的第一个链接规范之前。功能 可以在显式后无链接规范的情况下声明 已经看到了链接规范;明确指定的链接 之前声明中的不受此函数影响 声明。
无论您同时包含a.h
和b.h
都是关于abc_table
声明的语言链接规范。与函数不同,变量必须显式匹配。
要么在a.h
中删除链接规范,要么在b.h
中添加它。虽然然后您遇到了b.h
用内部链接定义对象名称的问题(由于const
),所以找不到该符号。
我将一起放弃b.h
中的声明。标头中的对象定义应尽量减少,特别是如果要与C代码进行接口的话。