我正在使用2013。我在C源文件(file1.c)中声明了一个全局变量,并在C++源文件(file2.cpp)中定义的方法中使用了该变量。两个文件中包含的标题将变量声明为extern。项目属性C\C++ -> Advanced -> compile as设置为defualt,根据文档,这意味着编译器使用文件扩展名来推断文件类型。此设置将导致unresolved external symbol链接错误。如果我将此选项设置为Compile as C code或Compile as C++ code,则项目编译和链接时不会出现错误。我不明白这种行为。(顺便说一句,在linux/GCC下,代码编译OK)。
下面是一个重现问题的最小示例:
// file1.h
extern int g_i;
// file1.c
#include "file1.h"
#include "file2.h"
int g_i;
int main() {
g_i = 1;
foo();
return 0;
}
// file2.h
#ifdef __cplusplus
extern "C"
#endif
void foo();
// file2.cpp
#include "file1.h"
#include "file2.h"
void foo() {
int i = g_i;
}发布于 2016-01-01 08:12:41
语言链接不仅适用于变量,也适用于函数。在C文件中,您定义了一个变量g_i,它显然将具有C语言链接(从C++编译器的角度来看)。在CPP文件(或者至少是头文件)中,您需要声明变量具有C语言链接。所以你需要的是:
// file1.h
#ifdef __cplusplus
extern "C"
#endif
extern int g_i;或者,假设真正的代码在头文件中有多个变量,您可能更倾向于:
// file1.h
#ifdef __cplusplus
extern "C" {
#endif
extern int g_i;
... // More declarations to taste
#ifdef __cplusplus
}
#endifGCC显然没有区分变量的C和C++链接(这是完全允许的)。
如果强制将所有内容编译为C,或者强制将所有内容编译为C++,那么当然变量的定义和变量的使用都默认为同一语言链接--所以它只是起作用了。
详情请参见linkage。特别是
..。每个具有外部链接的变量名,都有一个名为“语言链接”的属性。
https://stackoverflow.com/questions/34554505
复制相似问题