变量重名问题-引自大师兄的话

如果函数重名,链接时会报警

那么,变量重名呢?

答案是:不会报错。

它们的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函数的前面,加上"__"这样的前缀。

这样,我就能在编辑工具的函数列表中,一目了然的知道哪个是对外的函数,哪个是内部函数了。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值