当我构建源代码时,会抛出错误:declaration of 'globalMemTrace' has a different language linkage
#ifdef MEMDEBUG_SIMULATIONS
#include "mem-trace.h"
MemTrace *globalMemTrace;
#endif
// omitted unrelated parts
int Tcl_AppInit(Tcl_Interp *interp)
{
#ifdef MEMDEBUG_SIMULATIONS
extern MemTrace *globalMemTrace;
globalMemTrace = new MemTrace;
#endif
}
我已经多次用谷歌搜索了它。有些人说,如果clang
出现错误,有些人说使用extern
的伎俩可能会有所不同。
但由于我不是一个专业人士,我已经尝试了其中一些并未能解决它。有没有什么好方法可以处理它?</ p>
用C ++编写,问题发生在extern MemTrace *globalMemTrace;
答案 0 :(得分:4)
C ++在语言链接中提供了C ++和非C ++语言之间的链接。
例如
// in C++ program
extern "C" int displayfoo(const char *);
int main() {
return displayfoo("hello");
}
/* in C program */
#include <stdio.h>
extern int displayfoo(const char * str) {
while (*str) {
putchar(*str);
putchar(' ');
++str;
}
putchar('\n');
}
您正在使用来自c ++代码的C函数displayfoo
,因此您需要告诉编译器/链接器它来自不同的语言。这是由外部“C”完成的。
在您的代码中MemTrace *globalMemTrace;
可能先前已在c ++中的C代码或C块中声明,因此您需要将其声明为
extern "C" MemTrace *globalMemTrace;
答案 1 :(得分:2)
似乎此名称已声明为具有C语言链接。
extern "C" MemTrace *globalMemTrace;
答案 2 :(得分:2)
这意味着实际变量是在C代码中声明的,或者至少包含在C ++代码中的extern "C"
块中,但是extern
是在C ++代码中声明的,因此它无法链接到变量,因为它们存在于不同的语言中。
看看这些文章: