extern关键字讲解

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

2 问题:extern 变量
  在一个源文件里定义了一个数组:char a[6];
  在另外一个文件里用下列语句进行了声明:extern char *a;
  请问,这样可以吗? 

  答案与分析:
  1)、不可以,程序运行时会告诉你非法访问。原因在于,指向类型T的指针并不等价于类型T的数组。extern char *a声明的是一个指针变量而不是字符数组,因此与实际的定义不同,从而造成运行时非法访问。应该将声明改为extern char a[ ]。
  2)、例子分析如下,如果a[] = "abcd",则外部变量a=0x61626364 (abcd的ASCII码值),*a显然没有意义
  显然a指向的空间(0x61626364)没有意义,易出现非法内存访问。
  3)、这提示我们,在使用extern时候要严格对应声明时的格式,在实际编程中,这样的错误屡见不鲜。
  4)、extern用在变量声明中常常有这样一个作用,你在*.c文件中声明了一个全局的变量,这个全局的变量如果要被引用,就放在*.h中并用extern来声明。
3 问题:extern 函数1
  常常见extern放在函数的前面成为函数声明的一部分,那么,C语言的关键字extern在函数的声明中起什么作用?
  答案与分析:
  如果函数的声明中带有关键字extern,仅仅是暗示这个函数可能在别的源文件里定义,没有其它作用。即下述两个函数声明没有明显的区别:
extern int f(); 和int f();
  当然,这样的用处还是有的,就是在程序中取代include “*.h”来声明函数,在一些复杂的项目中,我比较习惯在所有的函数声明前添加extern修饰。

4 问题:extern 函数2
  当函数提供方单方面修改函数原型时,如果使用方不知情继续沿用原来的extern申明,这样编译时编译器不会报错。但是在运行过程中,因为少了或者多了输入参数,往往会照成系统错误,这种情况应该如何解决?
  答案与分析:
  目前业界针对这种情况的处理没有一个很完美的方案,通常的做法是提供方在自己的xxx_pub.h中提供对外部接口的声明,然后调用方include该头文件,从而省去extern这一步。以避免这种错误。
  宝剑有双锋,对extern的应用,不同的场合应该选择不同的做法。

5 问题:extern “C”
  在C++环境下使用C函数的时候,常常会出现编译器无法找到obj模块中的C函数定义,从而导致链接失败的情况,应该如何解决这种情况呢?

  答案与分析:
  C++语言在编译的时候为了解决函数的多态问题,会将函数名和参数联合起来生成一个中间的函数名称,而C语言则不会,因此会造成链接时找不到对应函数的情况,此时C函数就需要用extern “C”进行链接指定,这告诉编译器,请保持我的名称,不要给我生成用于链接的中间函数名。
  下面是一个标准的写法:
//在.h文件的头上
#ifdef __cplusplus
#if __cplusplus
extern "C"{
 #endif
 #endif /* __cplusplus */ 
 …
 …
 //.h文件结束的地方
 #ifdef __cplusplus
 #if __cplusplus
}
#endif
#endif /* __cplusplus */
 

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

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

相关文章

日志钩子(JournalRecord Hook)的使用

-- 钩子是WINDOWS中消息处理机制的一个要点,通过安装各种钩子,应用程序能够设置相应的子例程来监视系统里的消息传递以及在这些消息到达目标窗口程序之前处理它们。钩子的种类很多,每种钩子可以截获并处理相应的消息,如键盘钩子可…

优先队列

CSTL——优先队列 一、相关定义 优先队列容器与队列一样,只能从队尾插入元素,从队首删除元素。但是它有一个特性,就是队列中最大的元素总是位于队首,所以出队时,并非按照先进先出的原则进行,而是将当前队列…

linux命令行抓取网页快照-(xvfb+CutyCapt)

linux命令行抓取网页快照-(xvfbCutyCapt)又一个 WordPress 博客Browse: Home / 2009 / 十一月 / linux命令行抓取网页快照-(xvfbCutyCapt)linux命令行抓取网页快照-(xvfbCutyCapt)By saymoon on 2009年11月…

php过waf木马,一款过waf的一句话木马分析 | CN-SEC 中文网

摘要中午,下班回来,就看一个朋友给我发了几个马儿 让我看看解解密码 很简单中午,下班回来,就看一个朋友给我发了几个马儿 让我看看解解密码 很简单猛不猛我不知道 那时候手机 太长的看着就烦 就回到家瞅瞅了首先我们看这…

你没干什么坏事,你怕什么?

如图我很久就知道深信服这家企业,记得是几年前,我有一个同学跟我说,有一个比较厉害的朋友在这个企业上班,拿到了非常不错的薪水,我如果想去这个公司看看,可以让这位朋友帮忙搭线。后面查这个企业&#xff0…

C++中的explicit关键字用法

c中的explicit关键字用来修饰类的构造函数,被修饰的类的构造函数不能进行隐式类型的转换,既然有"显式"那么必然就有"隐式",那么什么是显示而什么又是隐式的呢? 如果c类的构造函数有一个参数,那么…

警告用户:VoIP电话存在诸多风险

IP电话是目前最为受欢迎的通信方式,但最近VoIP安全组织表示其拥有许多安全隐患。 该组织发布了一份IP电话供应商潜在的安全风险清单。旧式的公共开关网络电话(PSTN)并没有远离风险,而今VoIP也要加入这一风险行列。 秘密被偷听&…

织梦文章添加字段填栏目id,内容页调用字段里的栏目文章

在模型里增加个字段,然后在添加文章的时候,在字段里填了栏目id进去 在前台的内容页,调用这个字段栏目的多个文章出来 {dede:field.field1 runphpyes} global $dsql; $sql "select arc.*,tp.typedir,tp.typename,tp.corank,tp.isdefault…

python用循环打出阶梯图形,matplotlib阶梯图的实现(step())

step函数概述step函数用于绘制阶梯图。根据源码可知,step函数是对plot函数的轻量级封装,很多概念和用法与plot函数非常相似。def step(self, x, y, *args, wherepre, dataNone, **kwargs):cbook._check_in_list((pre, post, mid), wherewhere)kwargs[dra…

xbmc addons

XBMC新版“扩展功能”简介 目录1. 扩展功能模块结构2. 图片文件指引 2.1 icon.png2.2 fanart.jpg3. addon.xml 3.1 <addon>元素3.2 <requires>元素3.3 <extension>元素3.4 xbmc.addon.metadata extension4. extension类别本贴介绍将在即将发布的XBMC Dharma&…

嵌入式还有哪些风口值得入?

大家好&#xff0c;我是写代码的篮球球痴前两天发了篇文章说到嵌入式薪资的&#xff0c;很多人想知道目前有哪些不错的行业可以加入&#xff0c;这篇文章罗列了很多风口行业。我相信&#xff0c;半导体芯片会是很重要的方向&#xff0c;但是不管路修得多好&#xff0c;都需要汽…

两个学习指针的例子

下面的结果是多少&#xff1f; int a5; int *example1(int b) { ab; return &a; } int *example2(int b) { int c5; bc; return &b; } void main() { int *a1example1(10); int *b1example2(10); cout <<”a1”<<*a1; cout <<”b1”<&l…

java 统计单词个数和标点符号

把随机输入的一句话比如:Its only a test!存放在一个char[]的数组中&#xff0c;统计char[]中的单词个数和标点符号的个数。 package com.faintbear; import java.io.*; publicclassTest{ public static void main(String[] args) throws Exception{ BufferedReade…

Luogu 4244 [SHOI2008]仙人掌图

BZOJ 1023 如果我们把所有的环都缩成一个点&#xff0c;那么整张图就变成了一棵树&#xff0c;我们可以直接$dp$算出树的直径。 设$f_x$表示$x$的子树中最长链的长度&#xff0c;那么对于$x$的每一个儿子$y$&#xff0c;先用$f_x f_y 1$更新答案&#xff0c;再用$f_y 1$更新…

trim的返回值php,php trim()函数

(1)trim()函数。该函数可以去除字符串开始位置以及结束位置的空格&#xff0c;并返回去掉空格后的字符串。该函数声明如下&#xff1a;string trim ( string str [, string charlist])默认的情况下&#xff0c;该函数去除的字符如下。" " (ASCII 32 码为(0x20))&…

outlook 2007 自动答复邮件

outlook 2007自动答复邮件 步骤 1&#xff1a;创建邮件模板 提示 从 Microsoft Office Online 下载正式&#xff08;英文&#xff09;或者非正式&#xff08;英文&#xff09;外出邮件模板。 在“文件”菜单上&#xff0c;指向“新建”&#xff0c;然后单击“邮件”。在“选项…

我的朋友去国外出差回不来了

年前&#xff0c;我一个朋友因为项目调试需要去国外出差&#xff0c;出国的时候好好的&#xff0c;然后飞到当地没几天疫情突然爆发&#xff0c;国内取消了那个国家的航班&#xff0c;然后就直接滞留在当地回不来了。我朋友从事的是硬件开发&#xff0c;包括器件选型、原理图设…

再谈borland与MS对BUG的不同态度~

在讨论Delphi 6 SP1对BUG的修补问题时(http://www.delphibbs.com/delphibbs/dispq.asp?lid648516)&#xff0c;我提及“强烈建议Borland针对自己的产品出hotfix&#xff0c;而不是让大家非得等到Server Pack”&#xff0c;随后与y9y兄讨论到Borland和MS的不同态度。或者我们可…

JDBCUtils

1 package database;2 3 import java.sql.Connection;4 import java.sql.DriverManager;5 import java.sql.ResultSet;6 import java.sql.SQLException;7 import java.sql.Statement;8 9 /** 10 * <p> 11 * Description:JDBCUtils工具类 12 * </p> 13 * 14 *…

oracle 11g 组合分区,Oracle数据库

数据库分区是每种数据库都需具备的关键功能之一。几乎所有的Oracle数据库都使用分区功能来提高查询的性能&#xff0c;Oracle 11g分区功能可以简化数据库的日常管理维护工作&#xff0c;大大减轻了DBA(数据库设计和管理工程师)的工作负担。分区是探索数据仓库技术选项之一&…