关于声明变量关键字 extern 的搜索知识点

我定义了一个头文件,在头文件中需要先声明一下用的几个变量或者其他的数据,但是,我不在头文件中定义,

比如下面的内容

extern const int key1;
extern const int key2;

/*
extern可以置于变量或者函数前,以表示变量或者函数的定义在别的文件中,
提示编译器遇到此变量和函数时在其他模块中寻找其定义。
另外,extern也可用来进行链接指定。
也就是说,extern 只是声明,没有定义;它会在其他文件中定义;
*/

在360 百科中搜索到的例子内容是如下:

在一个源文件里定义了一个数组:char a;

在另外一个文件里用下列语句进行了声明:extern char *a;

请问,这样可以吗?

答案与分析:

1)、不可以,程序运行时会告诉你非法访问。原因在于,指向类型T的指针并不等价于类型T的数组。extern char *a声明的是一个指针变量而不是字符数组,因此与实际的定义不同,从而造成运行时非法访问。应该将声明改为extern char a[ ]。

2)、例子分析如下,如果a[] = "abcd",则外部变量a=0x12345678 (数组的起始地址),而*a是重新定义了一个指针变量,a指向的地址可能是0x87654321,直接使用*a是错误的.

3)、这提示我们,在使用extern时候要严格对应声明时的格式,在实际编程中,这样的错误屡见不鲜。

4)、extern用在变量声明中常常有这样一个作用:你要在*.c文件中引用另一个文件中的一个全局的变量,那就应该放在*.h中用extern来声明这个全局变量。

这个关键字真的比较可恶,在定义(函数)的时候,这个extern居然可以被省略,所以会让你搞不清楚到底是声明还是定义,下面分变量和函数两类来说:

尤其是对于变量来说。

extern int a;//声明一个全局变量a

int a; //定义一个全局变量a

extern int a =0 ;//定义一个全局变量a 并给初值。一旦给予赋值,一定是定义,定义才会分配存储空间。

int a =0;//定义一个全局变量a,并给初值,

声明之后你不能直接使用这个变量,需要定义之后才能使用。

第四个等于第三个,都是定义一个可以被外部使用的全局变量,并给初值。

糊涂了吧,他们看上去可真像。但是定义只能出现在一处。也就是说,不管是int a;还是int a=0;都只能出现一次,而那个extern int a可以出现很多次。

当你要引用一个全局变量的时候,你就要声明extern int a;这时候extern不能省略,因为省略了,就变成int a;这是一个定义,不是声明。

时间: 2024-12-09 23:24:21

关于声明变量关键字 extern 的搜索知识点的相关文章

关于Javascript中通过var关键字声明变量和function关键字声明函数的笔记

一.概念 1.变量声明 在JavaScript中,变量一般通过var关键字(隐式声明,let关键字声明除外)进行声明,如下通过var关键字声明a,b,c三个变量(并给其中的a赋值): var a=1,b,c; //关键字显式声明变量a,b,c,并给a赋值console.log(a); //1 //由于b,c未定义变量类型,因此输出"undefined"console.log(b); //undefinedconsole.log(c); //undefined //如果变量未声明,则输出

PHP 闭包获取外部变量和global关键字声明变量的区别

最近在学习workerman的时候比较频繁的接触到回调函数,使用中经常会因为worker的使用方式不同,会用这两种不同的方式去调用外部的worker变量,这里就整理一下PHP闭包获取外部变量和global关键字声明变量的区别. 闭包 闭包是一个常见的概念,我们通常可以将其与回调函数配合使用,可以使代码更加简洁易读. 闭包可以通过拷贝的方式让函数使用父作用域中的变量.如: $global = 'hello'; $bbb = function()use($global){ echo $global.

为什么JavaScript声明变量的时候鼓励加var关键字

在JavaScript中,var用来声明变量,但是这个语法并不严格要求,很多时修改,我们可以直接使用一个变量而不用var声明它. [javascript] view plaincopyprint? var x = "XX"; y ="xxx"; var x = "XX"; y ="xxx"; 诸如此类.这有一个问题,比如说在代码中的某一行,我想使用的一个已声明的变量x,结果由于打字或者拼写错误,这个变量被写成y了,结果相当于“

ES6知识点整理之第5篇----声明变量总结与global

1.ES6声明变量的6种方法: var function let const import class 2.ES5 的顶层对象,在各种实现里面是不统一的. 浏览器里面,顶层对象是window,但 Node 和 Web Worker 没有window. 浏览器和 Web Worker 里面,self也指向顶层对象,但是 Node 没有self. Node 里面,顶层对象是global,但其他环境都不支持. 现在有一个提案,在语言标准的层面,引入global作为顶层对象.也就是说,在所有环境下,gl

C# 关键字extern用法

修饰符用于声明在外部实现的方法.extern 修饰符的常见用法是在使用 Interop 服务调入非 托管代码时与 DllImport 属性一起使用:在这种情况下,该方法还必须声明为 static,如下面的示例所示:[DllImport("avifil32.dll")]private static extern void AVIFileInit(); 注意 extern 关键字还可以定义外部程序集别名,使得可以从单个程序集中引用同一组件的不同版本. 将 abstract(C# 参考)和

【转载】理解C语言中的关键字extern

原文:理解C语言中的关键字extern 最近写了一段C程序,编译时出现变量重复定义的错误,自己查看没发现错误.使用Google发现,自己对extern理解不透彻,我搜到了这篇文章,写得不错.我拙劣的翻译了一下.(原文:http://www.geeksforgeeks.org/understanding-extern-keyword-in-c/)   我确定这篇文章对c语言的初学者会有很大的帮助,因为这将使他们更好更熟练的使用c语言.所以就让我先来说说extern关键字在变量和函数上的应用.最基本

DSP 中关键字extern,cregister,Near ,Far,restrict,volatile

extern:extern可以置于变量或者函数前,以表示变量或者函数的定义在别的文件中,提示编译器遇到此变量和函数时在其他模块中寻找其定义.另外,extern也可用来进行链接指定. const: 可以用const定义一些变量或数组,以确保它的值不被改变. 例:int *const p = &x;  定义一个常量指针p给变量int.       const int *q = &x;  定义一个变量指针q给常量int. cregister:定义用来直接访问CPU控制寄存器的变量. 你可以先定义

【C/C++】关键字extern

extern关键字的含义是什么? extern是C/C++语言中表明函数和全局变量作用范围(可见性)的关键字,该关键字告诉编译器,其声明的函数和变量可以在本模块或其它模块中使用. extern关键字的一般用法是怎样的? 在模块的头文件中对本模块提供给其它模块引用的函数和全局变量以关键字extern声明. 例如,如果模块B欲引用该模块A中定义的全局变量和函数时只需包含模块A的头文件即可.这样,模块B中调用模块A中的函数时,在编译阶段,模块B虽然找不到该函数,但是并不会报错:它会在link阶段时从模

声明变量&定义变量

        从编译原理上来说,声明是仅仅告诉编译器,有个某类型的变量会被使用,但是编译器并不会为它分配任何内存.而定义就是分配了内存.这对于以关键字extern进行声明是一定成立的,而对声明格式"int a;"来说,则需要取决于编译器的具体取舍. 对于下面的两句代码: void func() { int a; // <C++ Prime>认为此是定义变量,然而我们此处认为这是声明 int b=1; // 定义整型变量b a=0; } 对于第一行代码,编译器不会做任何事,