如果函数重名,链接时会报警
那么,变量重名呢?
答案是:不会报错。
它们的sizeof,会遵循编译的结果,与它们各位的声明相同
悲剧的是,它们的地址,却是相同的。
举例:
a.c中内容如下:
#include <stdio.h>
#include <stdlib.h>
#include <strings.h>
typedef struct{
int a;
int b;
}str;
str tem;
void fun_a()
{
printf("In file a.c, sizeof(tem)= %d, addr: 0x%x\n", sizeof(tem), &tem);
}
b.c内容如下:
#include <stdio.h>
#include <stdlib.h>
int tem;
void fun_b()
{
printf("In file a.c, sizeof(tem)= %d, addr: 0x%x\n", sizeof(tem), &tem);
}
c.c内容如下:
#include <stdio.h>
#include <stdlib.h>
#include <strings.h>
extern void fun_a();
extern void fun_b();
int main()
{
fun_a();
fun_b();
return 0;
}
把这两个文件编译成一个程序,分别调用,则会发现,结果很悲剧。
In file a.c, sizeof(tem)= 8, addr: 0x804a024
In file a.c, sizeof(tem)= 4, addr: 0x804a024
fun_a中,sizeof值 为8,fun_b中,sizeof值为4.这都正常
问题是,addr,地址就不对了。它俩居然是同一个地址。
说到这里,你明白发生什么了吗?
是的,按照函数的链接规则,其实链接器应该报错的。报告重名变量。
但它没有
或许,它是为了照顾extern。
但是,如果你不小心,有了重名函数
再过分一点,可能张三写了个库,里边有个变量命名为foo
你恰好用到这个库,而恰好你的代码里,也有一个foo
那么,完蛋了。
你们有着不同意义的,不同大小的两个变量,它们却存在同一个位置当中。
当其中一个因为程序运转而被修改时,另一个躺枪了。
好吧,
那么,我们该怎么办呢?
static
对,就是它。
只要不对外提供的,就用static
事实上,我的习惯是这样的:
头文件中,只存在对外有用的数据结构、宏定义、函数声明
所有对外无用的,本文中使用的,什么结构体呀,枚举啊,任何东西,都放到C文件中。
同时,所有不对外的函数,全局变量,全部static
顺便,我会在所有static函数的前面,加上"__"这样的前缀。
这样,我就能在编辑工具的函数列表中,一目了然的知道哪个是对外的函数,哪个是内部函数了。