C语言零碎记录之extern

最近遇到了一个问题,就是一个头文件有一个static的变量,编译的文件有几个.o的,他们都引用了这个头文件,但是当打印出这个变量(经过修改了)的值得时候,居然不一样,打印出地址来,地址居然也不一样。两个不同地址,一个相同的变量名?究竟怎么回事情呢???

这个变量许多文件要用。但是放到h文件,又是个问题啊。。。

使用extern 声明外部变量,必须符合下面的情况

生成的.o 不能引用包括这个变量定义的文件。但是我又使用了这个头文件的其他函数,郁闷了。

经过试验 应是这样的,变量 不要用static,因为外部要extern使用,反而不能用static了 才郁闷呢。

实验如下:

head1.h

#include <stdio.h>
extern int str_i;

head1.c

#include "head1.h"
int str_j=5;
int main(){
printf("str_i=%d\n",str_i);
func();
printf("str_i=%d\n",str_i);

}

head2.h

#include <stdio.h>
extern int str_j;
int str_i=1;
void func();

head2.c

#include "head2.h"
void func(){
str_i=999;
printf("str_j=%d\n",++str_j);
}



编译方法为:

gcc -c head1.c
gcc -c head2.c
gcc -o main head1.o head2.o

或者

gcc -c head2.c
gcc -o main head1.c head2.o

结果如下:

$ ./main

str_i=1

str_j=6

str_i=999

head2 要使用的资源使用了

head1 要使用的资源也使用了。

但是head1不能使用head2的头文件,否则重复定义。

head2也不能使用head1的头文件,否则重复定义。

看来 使用 别人的东西,不一定要加 头文件的。函数声明 也没必要,只要在GCC中有对应的。o或lib就可以了。





 

转载请注明出处:http://www.cnblogs.com/ayanmw 多谢

------------------------------------------------------------------------------------------------

一定要专业!本博客定位于 ,C语言,C++语言,Java语言,Android开发和少量的Web开发,之前是做Web开发的,其实就是ASP维护,发现EasyASP这个好框架,对前端后端数据库 都很感觉亲切啊。. linux,总之后台开发多一点。以后也愿意学习 cocos2d-x 游戏客户端的开发。

原文地址:https://www.cnblogs.com/ayanmw/p/2371452.html