Visual Studio的extern关键字行为

时间:2014-04-05 22:02:46

标签: c visual-studio variables extern

我创建了这个最小的例子来说明我使用Visual Studio 2008进行extern声明的问题(编译python 2.7扩展需要)。同样的例子适用于gcc。 结果是我在lib.c中有2个单独的global_var变量而不是唯一的变量

库接口: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?

感谢任何提示!

劳伦

UPDATE:将global_var的extern声明从lib.h移到main.c(更简单的例子) 当然问题仍然存在......

2 个答案:

答案 0 :(得分:0)

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

您应该做的是向extern添加lib.c声明(例如,通过包含lib.h)并在其中初始化值,然后从lib.h中删除初始化。< / p>

所以它应该是这样的:

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)

答案 1 :(得分:0)

解决了我自己,我的错。

在Gcc下,我构建了一个静态库和一个动态库。我的main.c与STATIC库链接,因此在链接时解析了lib.c和main.c之间的可变分辨率。我忘记了。

在Visual Studio下,我只构建了一个DYNAMIC库,因此在DLL和main之间不会发生正常的变量链接。

很抱歉任何混乱......

相关问题