C语言中extern的用法
0x01
extern用在变量或函数的声明前,用来说明“此变量/函数是在别处定义的,要在此处引用”。
0x02
extern修饰变量的声明。
举例:若a.c中需引用b.c中的变量int v,可以在a.c中声明extern int v,然后就可以引用变量v;需要注意的是,被引用的变量v的链接属性必须是外链接(external)的,也就是说a.c要引用到变量v,不只是取决于在a.c中声明extern int v,还取决于变量v本身是能够被引用到的。这里涉及到另外一个话题---变量的作用域。能够被其他模块以extern引用到的变量通常是全局变量。
还有一点是,extern int v可以放在a.c中的任何地方,比如可以在a.c中函数func()定义的开头处声明extern int v,然后就可以引用到变量v了,只不过这样只能在func()作用域中引用变量v(这还是变量作用域的问题,对于这一点来说,很多人使用时都心存顾虑,好像extern声明只能用于文件作用域似的)。
0x03
extern修饰函数的声明。
本质上讲,变量和函数没有区别。函数名是指向函数二进制块开头处的指针。如果文件a.c要引用b.c中的函数,比如在b.c中原型是int func(int m),那么就可以在a.c中声明extern int func(int m),然后就能使用func()来做任何事情。就像变量的声明一样,extern int func(int m)可以放在a.c中的任何位置,而不一定非要放在a.c的文件作用域的范围中,
对其他模块中函数的引用,最常用的方法是包含这些函数声明的头文件。使用extern和包含头文件来引用函数的区别:extern的引用方式比包含头文件要间接得多。extern的使用方法是直接了当的,想引用哪个函数就用extern声明哪个函数。这大概是kiss原则的一种体现。这样做的一个明显的好处是,会加速程序的编译(确切地说是预处理)的过程,节省时间。在大型C程序编译过程中,这种差异是非常明显的。
0x04
此外,extern修饰符可用于指示C或者C++函数的调用规范。比如在C++中调用C库函数,就需要在C++程序中用extern "C"声明要引用的函数。这是给链接器使用的,告诉链接器在链接的时候用C函数规范来链接。主要原因是C++和C程序编译完成后再目标代码中命名规则不同。
0x05
简要例子:
#include <stdio.h>
#include <stdlib.h> int x = ;
int y = ;
int func1()
{
extern p, q;
printf("p is %d, q is %d\n", p, q);
return ;
} int p = ;
int q = ;
int main()
{
func1();
printf("x is %d, y is %d\n", x, y);
}
输出结果:
C语言中extern的用法的更多相关文章
- C语言中extern的用法--转
http://blog.sina.com.cn/s/blog_52deb9d50100ml6y.html 在C语言中,修饰符extern用在变量或者函数的声明前,用来说明“此变量/函数是在别处定义的, ...
- C语言中Extern用法
extern用在变量或函数的声明前,用来说明“此变量/函数是在别处定义的,要在此处引用”. extern修饰变量的声明. 举例:若a.c中需引用b.c中的变量int v,可以在a.c中声明extern ...
- C语言中qsort函数用法
C语言中qsort函数用法-示例分析 本文实例汇总介绍了C语言中qsort函数用法,包括针对各种数据类型参数的排序,非常具有实用价值非常具有实用价值. 分享给大家供大家参考.C语言中的qsort ...
- C语言中extern关键字的使用
C语言中extern关键字的使用,直接上代码. file1.c文件 #include<stdio.h> extern long power(int); int A = 2; int mai ...
- C语言中sizeof()的用法
语法 sizeof有三种语法形式: 1.sizeof(object); //sizeof(对象); 2.sizeof(type_name); //sizeof(类型); 3.sizeof object ...
- C/C++语言中const的用法
1. const 在C和C++中的区别 C++中的const正常情况下是看成编译期的常量,编译器并不为const分配空间,只是在编译的时候将期值保存在名字表中,并在适当的时候折合在代码中. 所 ...
- 在不同语言中static的用法
static (计算机高级语言) 编辑 像在VB,C#,C,C++,Java,PHP中我们可以看到static作为关键字和函数出现,在其他的高级计算机语言如FORTRAN.ALGOL.COBOL.BA ...
- C语言中 malloc函数用法
一.malloc()和free()的基本概念以及基本用法: 1.函数原型及说明: void *malloc(long NumBytes):该函数分配了NumBytes个字节,并返回了指向这块内存的指针 ...
- 浅析C语言中assert的用法(转)
原文地址:http://www.jb51.net/article/39685.htm 以下是对C语言中assert的使用方法进行了介绍,需要的朋友可以参考下. assert宏的原型定义在<ass ...
随机推荐
- SDK Manager 中 没有 Support Library怎么弄?
SDK Manager 中 没有 Support Library怎么弄?求大神帮忙 百度上面说的基本都试了,依旧没有弄出来 点击"Packages" > "Show ...
- JSBinding / Testing
Unity version compatibilities 5.3.5 5.2.0 5.1.5 5.0.4 4.7.2 4.7.0 4.6.9 4.6.0 4.5.5 Platform compati ...
- jdbc/DAO模式
DAO设计模式: 1.DAO: DAO设计模式是属于J2EE数据层的操作,使用DAO设计模式可以简化大量代码,增强程序的可移植性. 2.DAO各部分详解:DAO设计模式包括以下4个主要部分: ...
- case when
SELECT * FROM category WHERE EXISTS (SELECT * FROM goods WHERE goods.cat_id = category.cat_id) cat ...
- iso 培训笔记
protocol协议 + 类方法- 实例方法:继承()方法 <> [] 方法调用 .属性:参数mvc storyboard 资源文件info.plist 权限viewcontroller ...
- 【MySQL】悲观锁&乐观锁
悲观锁与乐观锁是两种常见的资源并发锁设计思路,也是并发编程中一个非常基础的概念.本文将对这两种常见的锁机制在数据库数据上的实现进行比较系统的介绍. 悲观锁(Pessimistic Lock) 悲观锁的 ...
- Oracle数据库自动增长列的实现过程
1.创建序列 -- Create sequence create sequence INNERID minvalue 1 maxvalue 99999999999999 start with 1 in ...
- some notes about spring aop
1 . timeCountIntecetor implements handlerInterceptor { preHandle(); postHandle(); afterComplete(); } ...
- html中空格转义字符
记录一下,空格的转义字符分为如下几种: 平时一般用的是 1. &160#;不断行的空白(1个字符宽度) 2. &8194#;半个空白(1个字符宽度) 3. &8195# ...
- CentOS 下 sftp 有人能连有人不能连 程序设定了禁用IP
问题现象: 局域网的一台Linux上运行有sftp Server. 大家用FileZilia 连接,有两个人能够连接,有两个人不能连接. 解决问题: 1.先查看服务器上的sftp server是哪一个 ...