时间:2021-05-19
C++编码过程中,我们经常谈及“定义”和“声明”,二者是编程过程中的基本概念。我们需要使用一个变量、类型(类、结构体、枚举、共用体)或者函数时,我们需要提前定义和声明。定义和声明的过程,就像我们向图书馆借阅书籍一般,需要先完成书籍的印刷,即创造出书籍,这是一个定义的过程,有了书籍,我们需要到图书馆完成借阅的登记手续,这是申明的过程。完成了申明,我们有了使用书籍的权限,就可以尽情的畅游在知识的海洋。如果说书籍是自己委托印刷厂印刷的,那么你无需向他人借阅,即无需声明,可以直接使用书籍。一本书籍只需要印刷一次,但是可以被多人多次借阅,也就是说定义只需要一次,但是声明可以有多次。这里的书籍指代的是“定义”和“声明”作用的对象,即变量、类型和函数。C/C++中,使用一个变量、类型或者函数必须先在使用前完成定义和声明。
定义和声明是容易混淆的概念,但通过上面的类比说明,可以看出:
(1)“定义”和“声明”的本质区别是声明可以出现多次,而定义只能出现一次;
(2)把声明的东西放在头文件,把定义的东西放在源文件(.c或者.cpp文件);
(3)类型的定义应该放在头文件,因为类型不具有外部连接性,不同源文件拥有相同的类型定义不会报编译错误,但头文件不能重复包含。
1.变量的定义与声明
定义变量,指明变量所属类型、名称、分配内存空间与初始化其初始值,如
int a=1;int a(1);如果不显示初始化,则按照编译器默认进行初始化。
声明变量,指明变量所属类型与变量名称,如:
extern int a;有一点需要注意,对于局部变量以及全局静态变量是不能通过extern进行前置申明的,即不能在定义之前通过声明来引用,因为局部变量的作用域是当前代码块,全局静态变量的作用域是当前源文件,都不是全局作用域,所以不能通过extern进行前置声明。全局变量允许在定义之前通过前置声明进行引用。参见如下代码片段。
#include <stdio.h>extern int a;extern static int b; //报错int main(){ extern int c; //报错 printf("a=%d,b=%d,c=%d",a,b,c); int c=2;}int a=0;static int b=1;2.类型的定义与声明
定义类型,指明类型的名称和内容。
struct test{int a;}或者给已经存在的类型起个别名。
typedef int int32;注意,类型的作用域是源文件,即类型不具有外部连接性质,因此可以在不同源文件定义相同名称的类型,比如定义同名的类是不会报重定义错误的,这也说明了类型的定义应该放在头文件中,但在同一个源文件定义相同名称的类型则编译器会报重定义错误。
声明类型,只给出类型的名称。
class A;类型被声明之后,可以用于声明其他的标识符,但不能利用它来定义对象,也不能使用类型的成员。
class A; //先声明类void show(A& a); //申明函数class A //后定义{public: int a; char b;};以上代码没有错误。但如下代码将报错:
class A; //先声明int main(int argc,char* argv[]){ A classA; classA.a=5; return 0;}class A //后定义{public: int a; char b;};该程序无法通过编译,原因是类A的所有成员的有效范围均是从定义类的地方开始,故使用未知的构造函数初始化其成员变量是错误的,会报使用未定义的 class “A”错误。
使用类型之前给出其定义式即可,即给出类型的名称和内容,或者利用typedef给一个类型起个别称。虽然说是定义类型,但还是将类型的定义放在头文件,即使被不同的源文件包含,因为类型不具有外部连接特性,所以不会报重定义错误的,这和变量和函数不同,不能将变量和函数的定义放在头文件!切记!这里所说的外部连接与内部连接的区别在于链接器接的时候是否将当前目标文件中的定义与其它目标文件对比,并报告是否有重定义错误。内连接不会进行对比,故不同源文件中定义相同名称的类型是不会报错的。
3.函数的定义与声明
定义函数,指明函数返回类型、函数名称、函数参数和函数体。
int test(char a,int b){ return a+b}声明函数,指明函数返回类型,函数名称和函数参数。
int test(char a,int b);//或者无需给出形参名称,只需要类型即可int test(char,int);从上面可以看出,函数定义与函数声明的区别是主要有两点:
(1)函数定义需要给出函数体,即函数的具体实现,函数声明不需要;
(2)函数定义必须给出形参名称,声明可以只给出形参类型。
以上就是区分c++中的声明与定义的详细内容,更多关于c++ 声明与定义的资料请关注其它相关文章!
声明:本页内容来源网络,仅供用户参考;我单位不保证亦不表示资料全面及准确无误,也不保证亦不表示这些资料为最新信息,如因任何原因,本网内容或者用户因倚赖本网内容造成任何损失或损害,我单位将不会负任何法律责任。如涉及版权问题,请提交至online#300.cn邮箱联系删除。
简单来说,extern“C”是C++声明或定义C语言符号的方法,是为了与C兼容。说来容易,要理解起来还是得费些周折,首先我们要从C++和C的区别说起。符号大家都
C/C++中extern关键字详解在C/C++编程过程中,经常会进行变量和函数的声明和定义,各个模块间共用同一个全局变量时,此时extern就派上用场了。定义e
C/C++如何获取当前系统时间的实例详解C库中与系统时间相关的函数定义在头文件中,C++定义在头文件中。一、time(time_t*)函数函数定义如下:time
在C语言中“char”是声明一个字符类型的指针,定义数据类型,char可以定义字符有变量、数组、指针。 C语言是一门面向过程的计算机编程语言,与C++、Jav
一、默认参数在C++中,可以为参数指定默认值。在函数调用时没有指定与形参相对应的实参时,就自动使用默认参数。默认参数的语法与使用:(1)在函数声明或定义时,直接