C语言中extern修饰符的用法

在C语言中,修饰符extern用在变量或者函数的声明前,用来说明“此变量/函数是在别处定义的,要在此处引用”。

0. extern修饰变量的声明。举例来说,如果文件a.c需要引用b.c中变量int v,就可以在a.c中声明extern int v,然后就可以引用变量v。这里需要注意的是,被引用的变量v的链接属性必须是外链接(external)的,也就是说a.c要引用到v,不只是取决于在a.c中声明extern int v,还取决于变量v本身是能够被引用到的。这涉及到c语言的另外一个话题--变量的作用域。能够被其他模块以extern修饰符引用到的变量通常是全局变量。还有很重要的一点是,extern int v可以放在a.c中的任何地方,比如你可以在a.c中的函数fun定义的开头处声明extern int v,然后就可以引用到变量v了,只不过这样只能在函数fun作用域中引用v罢了,这还是变量作用域的问题。对于这一点来说,很多人使用的时候都心存顾虑。好像extern声明只能用于文件作用域似的。

1. extern修饰函数声明。从本质上来讲,变量和函数没有区别。函数名是指向函数二进制块开头处的指针。如果文件a.c需要引用b.c中的函数,比如在b.c中原型是int fun(int mu),那么就可以在a.c中声明extern int fun(int mu),然后就能使用fun来做任何事情。就像变量的声明一样,extern int fun(int mu)可以放在a.c中任何地方,而不一定非要放在a.c的文件作用域的范围中。对其他模块中函数的引用,最常用的方法是包含这些函数声明的头文件。使用extern和包含头文件来引用函数有什么区别呢?extern的引用方式比包含头文件要简洁得多!extern的使用方法是直接了当的,想引用哪个函数就用extern声明哪个函数。这大概是KISS原则的一种体现吧!这样做的一个明显的好处是,会加速程序的编译(确切的说是预处理)的过程,节省时间。在大型C程序编译过程中,这种差异是非常明显的。

2. 此外,extern修饰符可用于指示C或者C++函数的调用规范。比如在C++中调用C库函数,就需要在C++程序中用extern “C”声明要引用的函数。这是给链接器用的,告诉链接器在链接的时候用C函数规范来链接。主要原因是C++和C程序编译完成后在目标代码中命名规则不同。

转载于:https://www.cnblogs.com/wanmero/archive/2012/04/13/2446534.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/422514.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

oracle linux6 u盘安装,U盘安装RHEL6

1)烧录ISO镜像用软碟通写入硬盘镜像rhel-server-6.5-x86_64-boot.iso,然后将rhel-server-6.2-x86_64-dvd.iso复制到U盘根目录备注:如果是烧录DVD那么就直接烧rhel-server-6.2-x86_64-dvd.iso即可,U盘安装linux不注意此处会发生找不到image错误…

ns2 仿真简介

NS是一种针对网络技术的源代码公开的、免费的软件模拟平台,研究人员使用它可以很容易的进行网络技术的开发,而且发展到今天,它所包含的模块已经非常丰富,几乎涉及到了网络技术的所有方面。所以,NS成了目前学术界广泛使…

oracle 邮件过程,oracle 发邮件 存储过程

CREATE OR REPLACE PROCEDURE send_mail(p_recipient VARCHAR2, -- 邮件接收人p_subject VARCHAR2, -- 邮件标题p_message VARCHAR2 -- 邮件正文)IS--下面四个变量请根据实际邮件服务器进行赋值v_mailhost VARCHAR2(30) : ‘smtp.cheyipai.com‘; --SMTP服务器地址v_u…

获得当前系统信息

1:直接调用函数 str 24 ComName; ; ComNameappl.company().ext();//当前公司ID curUserid();//当前用户iD systemDateget();//当前时间 Time2Str(timenow(),1,2);//时间转换函数 curuserid()//当前用户 2,使用Session对象 session xSession; ; xSessionn…

UNP Chapter 27 - 客户-服务器程序其他设计方法

27.1. 概述 27.13. 小结转载于:https://www.cnblogs.com/s7vens/archive/2012/04/16/2451948.html

网页设计师的最佳设计工具名单出炉

一个网站的基本设计是为了吸引大多数人。因此,要吸引更多的客户,他们需要运用所有可能的图案和花纹,创造出惊人的效果,体现网站自身的美感。这样,设计师就需要使用一些设计工具,以确保有更高的效率。创建3D…

node作为php中转带参数,Nodejs中使用命令行如何进行传参(代码)

本篇文章给大家带来的内容是关于Nodejs中使用命令行如何进行传参(代码),有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助。使用commander.js.npm install commander然后在代码中引入commander.js直接使用了。Tips:如…

重构36计(4)

第十九计:避免类的臃肿 在我接触过的大部分项目中,总会有一个“大胖子“类特别惹眼,一般来说,这“大胖子“实际上是整个系统的核心类之一,之所以“胖“,主要原因是很多人都会把自己需要的函数加到这个类中&…

oracle透明网关 中文,Oracle透明网关的一些文章

Oracle透明网关的一些文章: http://www.oracle.com/technetwork/database/gateways/index.html Oracle透明网关的认证清单见下: http://www.oracle.com/technetwork/database/gateways/certmatrix-168347.pdf Oracle透明网关的相关MOS文章: How to Configure DG4MSQL (Database…

HDOJ1879(继续畅通工程)

题目链接 最小生成树的题。克鲁斯卡尔算法。 View Code 1 #include <stdio.h>2 #define N 1003 #define M 50004 struct node5 {6 int a,b,d;7 }edge[M];8 int n;9 int p[N]; 10 void make_set() 11 { 12 int i; 13 for(i1;i<n;i) p[i]i; 14 } 15 int …

学不会的JAVA,消不了的忧愁! 1

亲爱的网友&#xff0c;和大家一样&#xff0c;来这里看贴子的&#xff0c;都会有一个共同的地方&#xff0c;那就是对JAVA有着或深或浅的爱好。 或许是我太笨吧&#xff0c;有不少书上明明写着&#xff0c;JAVA是一种很容易学习的编程语言&#xff0c;但我断断续续学过近两年的…

bug是什么PHP,bug是什么

在程序设计中&#xff0c;bug一词&#xff0c;是我们经常听到的&#xff0c;那么bug是什么意思&#xff0c;下面我们来总结一下。什么是bug?在IT中&#xff0c;bug一般表示程序中出现的错误&#xff0c;因为软件运行中出现错误&#xff0c;或者是硬件造成的错误&#xff0c;出…

程序员的十层楼

转自&#xff1a;http://sunfengcheng.iteye.com/blog/326198 自西方文艺复兴以来&#xff0c;中国在自然科学方面落后西方很多&#xff0c;软件领域也不例外。当然现在中国的许多程序员们对此可能有许多不同的意见&#xff0c;有些人认为中国的程序员水平远落后于西方&#xf…

php 渐变色,段落每行渐变色文本效果

这次给大家带来段落每行渐变色文本效果&#xff0c;段落每行渐变色文本效果的注意事项有哪些&#xff0c;下面就是实战案例&#xff0c;一起来看一下。今天小编在Codepen上看到一个CSS写的效果。一个段落的每行文本是渐变效果。对于单行文本或单个词实现渐变填充效果并不是什么…

linux中apache配置文件在哪,linux网站服务Apache的安装与配置方法详解

这篇文章介绍下linux网站服务apache的安装与配置方法&#xff0c;包括挂载光盘&#xff0c;安装http服务&#xff0c;管理httpd服务&#xff0c;httpd的配置文件几大部分。具体详情可以参考下文。1.挂载光盘自己习惯将光盘挂载在/media/cdrom目录&#xff0c;在做本地yum源的时…

mysql数据到导入导出

问题&#xff1a;500M的库表数据&#xff0c;需要导入到新的数据库中。 首先通过控制台进入mysqlmysql -u root -p 12345CREATE DATABASE demo DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;use demo&#xff1b;切换数据库source file.sql 导入数据&#xff0c;这其中…

linux安装数据库依赖包,Linux下安装DB2的包依赖

检查的时候&#xff0c;报包依赖错误&#xff0c;解决办法yum install libaio-0.3.109-13.el7.i686yum install libstdc.so.6yum install pam-devel.i686yum install pam.i686yum whatprovides package-name1.DBT3514W The db2prereqcheck utility failed to find the followi…

SEO笔记—网页结构优化(四)

网页结构优化是页面优化的重点之一&#xff0c;它是对网页内容布局的规划&#xff0c;合理的网页结构能够有效地提高用户体验和搜索引擎的友好性。网页主要包含导航栏、栏目以及正文三部分组成&#xff0c;对网页结构的主要也是围绕这三部分进行的。 1、页面重要区域分布规律 搜…

linux下spi有哪些函数,linux下怎么快速的使用 SPI 驱动。

ek_spi_devices 数组就在本文件内。/** SPI devices.*/static struct spi_board_info ek_spi_devices[] {#if !(defined(CONFIG_MMC_ATMELMCI) || defined(CONFIG_MMC_AT91)){/* DataFlash chip */.modalias "mtd_dataflash",.chip_select 1,.max_speed_hz 15 * 100…

hasLayout和filter滤镜的细节

filter:alpha(opacity60); IE(<9)透明滤镜失效。 如果我们设置宽度后filter就会有效果&#xff0c;而这个没有设置宽度hasLayout 属性值是0 熟悉haslayout 的都知道&#xff0c;这个表示当前容器不是一个有形体 在IE中filter套用到容器上时&#xff0c;容器必需是「有形体」…