C语言的extern声明辨析

1 基本解释

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修饰。

时间: 2024-08-03 10:37:04

C语言的extern声明辨析的相关文章

C++中的extern声明变量详解_C 语言

extern声明变量无外乎如下两种: 1.声明全局变量 2.声明函数 今天我们只谈extern,什么const.static之类等等与之相关或不相关的一律忽略,下面就分别对以上两种情况一一讲解 声明和定义既然提到extern声明变量,那我们就必须搞清楚声明和定义的区别. 这里我们将普通数据变量和函数统称变量.从内存分配角度来说,声明和定义的区别在于声明一个变量不会分配内存,而定义一个变量会分配内存.一个变量可以被声明多次,但是只能被定义一次. 基于以上前提,我们可以把声明和定义类比为指针和内存的

c语言struct的声明定义问题,这段代码对吗,怎么理解?

问题描述 c语言struct的声明定义问题,这段代码对吗,怎么理解? static struct { int32_t hold_course_cd; bool locked_course; float locked_course_err; } steer_state = { hold_course_cd : -1, locked_course : false, locked_course_err : 0 }; 解决方案 定义了结构体,然后再定义 了 static 的结构体变量 steer_sta

c语言-关于extern char *arr[];编译报错的问题

问题描述 关于extern char *arr[];编译报错的问题 #include #include extern char *arr[];//在这行报错 int main(){ int i=0; while(arr[i++]) printf("%sn",arr[i]); system ("pause"); return 0; } 用VS2010编译这段代码时报错: IntelliSense: 不允许使用返回数组的函数 解决方案 通过论坛求助,编译已不再报错,以下

C语言中函数声明与调用问题_C 语言

假如函数在调用它之前定义可以不用声明 实际上,如果在函数调用前,没有对函数作声明,则编译系统会吧第一次遇到的该函数的形式(函数定义或者函数调用)作为函数的声明,并将函数默认值类型认为int型 比如有您调用的是void max(int a,int b)系统就会把该函数当做int max(int a,int b);

C/C++中extern "C" 的作用分析_C 语言

我们经常会在C/C++程序中见到extern "C",这是一个很重要的概念.本文就来以实例形式讲述C/C++中extern "C"的作用.分享给大家供大家参考之用.具体分析如下: 作用:实现C和C++混合编程. 原理:C和C++编译器编译之后,函数名会编译成不同的名字,链接阶段名字查找会找不到目标,后面实例中会详解. 用法:①.c文件中定义的函数,.cpp文件要调用时,该.cpp文件中要用extern "C"声明该函数:②.反过来,.cpp文件中

C语言基础知识点解析(extern,static,typedef,const)_C 语言

一.extern的使用方法 下面是<C语言程序设计>中的关于extern的解释: 在一个源程序的所有源文件中,一个外部变量只能在某个文件中定义一次,而其他文件可以通过extern声明来访问它(定义外部变量的源文件中也可以包含对该外部变量的extern声明).外部变量的定义中必须指定数组的长度,但extern声明不一定指定数组的长度. 外部变量的初始化只能出现在其定义中. 假设函数push与pop定义在一个文件中,而变量val与sp在另一个文件中定义本那个被初始化(通常不太可能这样组织程序),则

对C语言编程标准以及声明的基本理解_C 语言

c语言标准1978年,丹尼斯·里奇(Dennis Ritchie)和Brian Kernighan合作出版了<C程序设计语言>的第一版.书中介绍的C语言标准也被C语言程序设计师称作"K&R C",第二版的书中也包含了一些ANSI C的标准.K&R C主要介绍了以下特色: 结构(struct)类型 长整数(long int)类型 无符号整数(unsigned int)类型 把运算符=+和=-改为+=和-=.因为=+和=-会使得编译器不知道用户要处理i = +1

深入分析C++中声明与定义的区别_C 语言

        首先谈下声明与定义的区别.         声明是将一个名称引入程序.定义提供了一个实体在程序中的唯一描述.声明和定义有时是同时存在的. 如int a; extern int b=1;     只有当extern中不存在初始化式是才是声明.其他情况既是定义也是声明.      但是在下列情况下,声明仅仅是声明: 1:仅仅提供函数原型.如void func(int,int); 2: extern int a; 3:class A: 4:typedef声明 5:在类中定义的静态数据成

C语言中声明和定义详解

变量声明和变量定义 变量定义:用于为变量分配存储空间,还可为变量指定初始值.程序中,变量有且仅有一个定义. 变量声明:用于向程序表明变量的类型和名字. 定义也是声明,extern声明不是定义 定义也是声明:当定义变量时我们声明了它的类型和名字. extern声明不是定义:通过使用extern关键字声明变量名而不定义它. [注意] 变量在使用前就要被定义或者声明. 在一个程序中,变量只能定义一次,却可以声明多次. 定义分配存储空间,而声明不会. C++程序通常由许多文件组成,为了让多个文件访问相同