现在的位置: 首页 > 综合 > 正文

C语言零碎记录之extern

2012年01月29日 ⁄ 综合 ⁄ 共 825字 ⁄ 字号 评论关闭

最近遇到了一个问题,就是一个头文件有一个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就可以了。

 

 

抱歉!评论已关闭.