C visualstudio中的extern关键字行为

C visualstudio中的extern关键字行为,c,visual-studio,variables,extern,C,Visual Studio,Variables,Extern,我创建了这个最小的示例来说明我在VisualStudio2008中使用extern声明时遇到的问题(编译python 2.7扩展时需要使用extern声明)。同样的例子也适用于gcc。 结果是我有两个单独的全局变量,而不是lib.c中唯一的一个 库接口:lib.h #ifndef LIB_H #define LIB_H 1 int __declspec( dllexport ) displayGlob(); #endif // LIB_H 图书馆代码 // lib.c #include&l

我创建了这个最小的示例来说明我在VisualStudio2008中使用extern声明时遇到的问题(编译python 2.7扩展时需要使用extern声明)。同样的例子也适用于gcc。 结果是我有两个单独的全局变量,而不是lib.c中唯一的一个

库接口:lib.h

#ifndef LIB_H
#define LIB_H 1

int __declspec( dllexport ) displayGlob();

#endif // LIB_H
图书馆代码

// lib.c
#include<stdio.h>

int global_var=2;

int __declspec( dllexport ) displayGlob() {
    printf("lib.c global_var=%d\n", global_var);
    return global_var;
}
问题:

1-为什么我必须用Visual Studio而不是Gcc初始化lib.h中的extern变量

2-为什么第二个displayGlob()显示的全局变量lib.c没有修改为3

谢谢你的提示

洛朗

更新:将全局_var的外部声明从lib.h移到main.c(更简单的示例)
当然问题仍然存在…

因为C预处理器基本上在调用
#include
时粘贴内容,它与您在
main.C
文件中声明的
extern
相同。这意味着此符号定义了两次(在
main.c
lib.c
中)

您应该做的是将
extern
声明添加到
lib.c
(例如包括
lib.h
)并在那里初始化值,然后从
lib.h
中删除初始化

所以它应该是这样的:

lib.h:

extern global_var;
lib.c:

#include "lib.h"
int global_var=2;
main.c

#include "lib.h"
(no global_var definition/declaration here)

我自己解决了,我的错

在Gcc下,我构建了一个静态库和一个动态库。我的main.c和静态库链接,所以lib.c和main.c之间的变量解析在链接时解析。我忘了

在VisualStudio下,我只构建了一个动态库,所以在DLL和main.o之间不能发生正常的变量链接


很抱歉造成任何混乱…

是的,您有两个全局变量。一个在DLL中,另一个在EXE中。不要这样做。在.c文件中,要么标记变量
extern
,要么包含头。此外,您几乎不希望在头中定义变量(因此请删除初始化)。如果我没有初始化extern,那么在.c文件中有一个链接errorextern不是一个好主意。Extern不是一个定义,它只是一个声明。因此,它可以在一个文件中多次使用。您是对的,
extern
不应该与定义一起使用,它只能与声明一起使用。在lib.c中添加lib.h(我在询问之前已经尝试过)时,我有一个重新定义错误:1>\lib.c(7):错误C2374:“全局变量”:重新定义;多重初始化1>vs2008\main\lib.h(4):请参阅'global_var'的声明@Iclevy:您做错了什么。正如错误消息所说,您有两个
global\u var
的定义,而
lib.c
中应该只有一个-in。然后,您应该有多个带有
extern
关键字的
global\u var
声明-使用此变量的每个文件中都有一个声明。请参阅我的更新答案。应用您的建议:通过lib.h将“extern int global_var;”包含在main.c中,我得到了“main.obj:错误LNK2001:未解析的外部符号global_var”
#include "lib.h"
int global_var=2;
#include "lib.h"
(no global_var definition/declaration here)