【发布时间】:2014-04-10 03:21:33
【问题描述】:
我创建了这个最小示例来说明我在 Visual Studio 2008 中的 extern 声明问题(编译 python 2.7 扩展所必需的)。同样的例子也适用于 gcc。 结果是我有 2 个单独的 global_var 变量,而不是 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;
}
使用库变量“global_var”和函数displayGlob()的用户代码
// main.c
#include"lib.h"
#include<stdio.h>
#include<stdlib.h>
extern int global_var=0; // must be initialized otherwise "error LNK2001: unresolved external symbol global_var"
int main(int argc, char *argv[])
{
printf("main.c global_var=%d\n", global_var);
displayGlob();
global_var = 3;
printf("main.c global_var=%d\n", global_var);
displayGlob();
exit(0);
}
执行结果为:
main.c global_var=0
lib.c global_var=2
main.c global_var=3
lib.c global_var=2
问题:
1 - 为什么我必须用 Visual Studio 而不是 Gcc 来初始化 lib.h 中的 extern 变量?
2 - 为什么第二个 displayGlob() 显示的 global_var lib.c 没有修改为 3 ?
感谢任何提示!
劳伦特
更新:将 global_var 的 extern 声明从 lib.h 移至 main.c(甚至更简单的示例) 当然问题仍然存在......
【问题讨论】:
-
是的,你有两个全局变量。一个在 DLL 中,另一个在 EXE 中。不要那样做。
-
在 .c 文件中,标记变量
extern或包含标题。此外,您几乎不想在标头中定义变量(因此删除初始化)。 -
标头(和 global_var 的外部声明)已包含在 main.c 中。如果我不初始化extern,我有一个LINK错误
标签: c visual-studio variables extern