C/C++——extern 、extern "C"、数组名和指针名的区别。

6 篇文章 0 订阅

extern可以置于变量或者函数前,以标示变量或者函数的定义在别的文件中,提示编译器遇到此变量和函数时在其他模块中寻找其定义。此外extern也可用来进行链接指定。

extern “C”

当它与"C"一起连用时,如: extern “C” void fun(int a, int b);
则告诉编译器在编译fun这个函数名时按着C的规则去翻译相应的函数名,而不是按照C++的规则,
C++的规则在翻译这个函数名时会把fun这个名字变得面目全非,可能是 fun@aBc_int_int#%$,也可能是别的,这要看编译器的"脾气"了(不同的编译器采用的方法不一样),
编译器为什么这么做呢,因为C++支持函数的重载啊,在这里不去过多的论述这个问题。

extern 变量或函数

如在头文件中: extern int g_Int;
它的作用就是声明函数或全局变量的作用范围的关键字,其声明的函数和变量可以在本模块或其他模块中使用。也就是说模块B(编译单元)要是引用模块A(编译单元)中定义的全局变量或函数时,它只要包含模块A的头文件即可,在编译阶段,模块B虽然找不到该函数或变量,但它不会报错,它会在连接时从模块A生成的目标代码中找到此函数。

在一个源文件里定义了一个数组:char a[6];在另外一个文件里用下列语句进行了声明:extern char *a;
程序运行时会告诉你非法访问。原因在于,指向类型T的指针并不等价于类型T的数组。
extern char *a声明的是一个指针变量而不是字符数组,因此与实际的定义不同,从而造成运行时非法访问。

应该将声明改为extern char a[ ]。

数组名和指针名的区别

如果a[] = “abcd”,则外部变量a=0x61626364 (abcd的ASCII码值);
*a显然没有意义,显然a指向的空间(0x61626364)没有意义,易出现非法内存访问。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值