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

son*_*ong 5 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
}
Run Code Online (Sandbox Code Playgroud)

我已经用Google搜索过几次了.有人说,这是由于一个错误,如果clang和一些说使用extern不同的技巧可以解决它.

但由于我不是这样的专业,我已经尝试了其中的一些而未能解决它.有什么好方法可以解决它吗?

它是用C++编写的,问题发生在 extern MemTrace *globalMemTrace;

Dip*_*pto 7

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');
} 
Run Code Online (Sandbox Code Playgroud)

您正在使用 C displayfoo++ 代码中的 C 函数,因此您需要告诉编译器/链接器它来自不同的语言。这是由 extern "C" 完成的。

在您的代码中MemTrace *globalMemTrace;可能之前在 C 代码或 C++ 中的 C 块中声明,因此您需要像这样声明

extern "C" MemTrace *globalMemTrace;
Run Code Online (Sandbox Code Playgroud)


Vla*_*cow 2

看来这个名称已经被声明为具有 C 语言链接。

extern "C" MemTrace *globalMemTrace;
Run Code Online (Sandbox Code Playgroud)