近来思绪比较凌乱,于是想写点什么来寄托空虚寂寞之情怀,支撑自己孤苦无助的人生。但是又不想写鸡汤,那么,我们来聊聊“声明”和“定义”吧。 先来提个问题:为什么每次圣斗士出招之前都要大喊一下招式? 嗯,没错!因为函数要先声明,然后才能调用。 举个栗子: 我们定义了一个这样子的函数 --> int function (int person1, int person2) { papapa … } 那么,一般我们会在头文件中做这样子的声明 --> int function (int person1, int person2); 那么,问题来了:为什么需要声明? (砖家来了)因为C/C++是强类型的语言,如果不声明就使用,在一个编译单元中,编译器没有办法判断使用是否合法,如参数个数、参数类型匹配等等,这样强类型就难以实现。 这是一个大神说了算的世界,不服你来写个编译器啊! 有些小朋友可能会说:“谁说函数要先声明才能调用的?我没有声明一样可以调用呀,不信你看!” void sayHello() { cout<<"hello"<<endl; } int main() { sayHello(); } (砖家又来了)这位小朋友你是猪啊?!都叫你别看那么多暴走漫画喽,这是声明和定义放在一起了,而且是在main函数前面,所以编译器不会报错。顺便简单提一下:声明在编译期确定,定义在运行期确定。 下面再说一下变量的声明和定义,据说这个重要的概念在大学里从来没有被提起过,不管你信不信,反正我大学那会真的木有老湿跟我讲过。(这是一个沉重的话题,略过。。。) 大家打起精神,我们一起探讨: What is 定义?——所谓的定义就是编译器创建一个对象,为这个对象分配一块内存并给它取上一个名字,这个名字就是我们所说的变量名/对象名。这个名字一旦和这块内存匹配起来,它们就同生共死,终生不离不弃(好浪漫,正所谓:执子之手,与子偕老),并且这块内存的位置也不能被改变。一个变量或对象在一定区域内(涉及作用域和生命周期)只能被定义一次,如果定义多次,编译器会提示你重复定义同一个变量或对象。 What is 声明?——告诉编译器,这个名字已经匹配到一块内存上了,所以你不能再用它作为你将定义的变量名/对象名(可爱的白菜已经被可恶的猪给拱了,没办法,谁叫你腿短),下面代码中出现的变量或对象在别的地方定义了,需要明确,声明是可以出现多次的(想象一下圣斗士喊了N多次才出大招 -_-#)。 所以,定义和声明最重要的区别在于,定义创建了对象并为这个对象分配了内存,声明没有分配内存(不管是黑猪还是白猪,有白菜的猪才是幸福的猪)。 细心的小朋友可能已经想到,对于局部变量来说,这种变量的声明再使用是很少出错的,关键是变量作为全局变量的时候所带来的一些困扰。 说到这,就不得不提static和extern这两个关键字了。static的几种用法就不多说了,这里提醒!如果想让你的全局变量能用于多个文件,一定不要加static啊。 (砖家悄悄地出现了)众所周知,全局变量应该是得到内存分配且可以被其他模块通过extern调用的变量。因此,必须在.c和.h文件中声明,但是这种重复的声明很容易导致错误。 栗子来了: 假设在一个.c文件里定义全局变量a:int 这就是为什么重复声明容易导致错误。这时候,大神头上的灯泡亮了,说:“只声明一次不就完了嘛”。 对,这就是这篇文章的重点,大家看好了! 在头文件中定义全局宏: #ifdef xxx_GLOBALS #define xxx_EXT #else #define xxx_EXTextern #endif 为.h文件中每个全局变量都加上xxx_EXT的前缀。xxx代表模块的名字,然后在该模块的.c文件中定义:#definexxx_GLOBALS。 当编译器处理.c文件时,它强制xxx_EXT为空(因为xxx_GLOBALS已经定义),所以编译器会为全局变量分配内存空间。而其他的.c文件,由于xxx_GLOBALS没有定义,所以xxx_EXT被定义为extern,这样用户就可以调用外部全局变量了。 哇咔咔,大神果然是大神。 又有捣蛋的小朋友出来了,说:“既然上面出现的问题是由于把int改为double而导致的,那么干脆就不要写变量类型呗”。 没错,这位小朋友很聪明,声明时直接写:extern a;也是可以的。但是写上类型会更合理,因为你不是一个人在战斗啊,在团队协作项目中,很多时候你所参与的只是其中某些模块,所以,你懂的! 而且上面只声明一次的做法真的是很方便嗲。*^_^* 好哒,写到这里就要告一段落了。相信能看到这里的,都是和我一样即使生活再苦逼但内心依然充满希望的单身狗。 如果这篇文章能让你进一步理解声明和定义,那么我很高兴,请叫我红领巾,不谢。 如果对文章的内容有任何疑义,请不要来找我,我只想静静地做个美男子。 |
定义 & 声明
时间: 2024-10-10 15:40:10
定义 & 声明的相关文章
C/c++中 数组全局变量的定义声明 与 引用声明
数组声明一次,所有的 定义声明 有切仅有一次! 别人遇到的问题如下: 在声明定义时,定义数组如下: int G_glob[100]; 在其他文件引用时声明如下: int *G_glob; 这样的操作,在vc中,是可以编译通过的,这种情况大家都比较模糊并且需要注意,数组与指针类似,但并不等于说对数组的声明起变量就是指针.上面所说的的程序在运行时发现了问题,在引用声明的那个文件中,使用这个指针时总是提示内存访问错误,原来我们的连接程序并不把指针与数组等同,连接时,也不把他们当做同一个定义,而是认
javascript中定义声明函数的四种方法
javascript中定义声明函数的四种方法 :http://blog.163.com/zzf_fly/blog/static/209589158201286104927248/ 方法一:function functionName([parameters]){functionBody}; 方法二:将一个未命名的函数function赋给一个指定变量(var):var add=function(a, b){} 方法三:使用new运算符声明函数varName=new Function([param1N
c++ 变量 定义 声明
我们在程序设计中,时时刻刻都用到变量的定义和变量的声明,可有些时候我们对这个概念不是很清楚,知道它是怎么用,但却不知是怎么一会事,下面我就简单的把他们的区别介绍如下:(望我的指点对你受益) 变量的声明有两种情况: 1.一种是需要建立存储空间的.例如:int a 在声明的时候就已经建立了存储空间. 2.另一种是不需要建立存储空间的. 例如:extern int a 其中变量a是在别的文件中定义的. 前者是“定义性声明(defining declaration)”或者称为“定义(definition
解决already defined in .obj 的问题(定义/声明的区别)
首先需要搞清楚什么是定义(definition ),什么是声明(declaration). 一.函数 函数的声明: int myfunc(int a,int b); 定义: int myfunc(int a,int b){ return a+b; } .h中虽然可以声明然后定义函数,但是这样这.h就只能被#include一次,否则就会出现重定义错误: Error LNK2005 _myfunc already defined in xxx.obj 所以尽量不要再.h中定义函数. 二.变量 变量的
stm8 全局变量定义 声明
1.ST Visual Develop 开发环境下.h文件里面不能定义变量,要把变量定义在.C文件里面,然后在.H文件里面声明即可.补充:今天突然发现还有一种情况,变量在一个.h文件里定义后,在另外的一个.h文件里做extern声明后也可以,后来发现,这两个.h文件都没有自己的.c文件以及都是在工程文件的同层路径而不是在模块的文件里面. 2.ST Visual Develop 开发环境如果出现进入或者退出DEBUG很慢,或者菜单栏消失这类问题,就是工程文件出现了异常,只要新建工程或者把近期OK的
引用&;&;指针&;&;返回值&;&;定义声明&;&;生命周期&;&;const
1. 首先了解一下声明和定义的区别: ? 声明,其实就是描述一个元素是有什么构成的; ? 定义,其实就是在内存中划分出一个区域且用符号关联起来; ? 变量和对象不加extern永远是定义,类中的除外. 函数只有函数头是声明,有函数体的是定义. 类永远只是声明.类成员函数的函数体是定义. ? 函数的声明和定义的不同点在于函数的声明不包含函数体,仅仅是fact(): 2. 其次了解一下局部对象的生命周期 ? 局部变量 i. 形参和函数体内定义的变量统称局部变量 ii. 局部变量转换成为全局变量,则使
C++-函数重载(reload), 函数定义声明(void func(int))
对于相同的函数名字,根据其输入的变量不同进行函数重载 /* 根据函数的输入变量不同进行函数重载 */ #include <iostream> using namespace std; void foo(int i) { cout << "int foo(int i)" << endl; } void foo(int i, int j) { cout << "void foo(int i, int j)" <<
关于 JavaScript 二维数组和多维数组的定义声明
之前在写扫雷的时候,因为需要用到二维数组,出现了问题,所以记录一下. 当我们在需要使用多维数组的时候,一定要使用正确的声明,不然就会出行令人头大的问题: // 正确的声明 var arr = [] arr[0] = [] arr[1] = [] arr[2] = [] // 或者 arr[0] = [0, 0, 0] arr[1] = [0, 0, 0] arr[2] = [0, 0, 0] 演示一下错误的声明: // 错误的声明 var arr = [] var arr2 = [0, 0, 0
变量定义与变量声明
1.看例子如下: int tern=1: main() { extern int tern; ...... 这里tern 声明了两次,第一次声明为变量留出了存储空间.它构成了变量的定义.第二次声明只是告诉编译器使用先前定义的变量tern,因此不是一个定义.第一次声明称为定义声明,第二次声明称为引用声明,关键字extern表明该声明不是一个定义,因此它指示编译器参考其他地方.而且extern是一个引用声明,绝不是定义声明,所以不可用它进行定义操作.木有这种的操作的哦. 2.具有内部链接的静态变量