'x'的声明具有不同的语言链接

时间:2014-01-15 06:09:47

标签: c++ c

当我构建源代码时,会抛出错误: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;

3 个答案:

答案 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 ++代码中声明的,因此它无法链接到变量,因为它们存在于不同的语言中。

看看这些文章:

Language linkage

Linking C and C++ code