C visualstudio中的extern关键字行为
我创建了这个最小的示例来说明我在VisualStudio2008中使用extern声明时遇到的问题(编译python 2.7扩展时需要使用extern声明)。同样的例子也适用于gcc。 结果是我有两个单独的全局变量,而不是lib.c中唯一的一个 库接口:lib.hC 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
#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)