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