【基础篇】C++中声明和定义的区别

在C和C++中,声明和定义的概念经常容易混淆

在由多个文件构成的程序中,一个文件的函数可能经常需要访问来自于其他文件的函数或者变量,因此在编译过程中,编译器必须要知道另一些文件中有哪些函数和变量,尤其是它们的基本用法。因为编译器需要确保来自其他文件的数据也能被正确的使用而不是错误的使用带来不可预知的错误。

在c和c++中,有两种常见的和编译器交流的方式:定义(definition)和声明(declaration)。

告知编译器外部函数或变量的名称及类型,这一过程就是声明,声明过程中编译器不为程序员所声明的对象分配单元,只是让编译器知道怎样检查对声明对象的引用以确保不出错。

而定义的意思是,创建一个新的数据,告诉编译器,“我要在此处创建一个新的变量/函数”,不论程序员所分配的对象是变量或函数,编译器都会立即为该对象分配内存空间。(对于变量来说,编译器所分配的内存空间就是该变量的类型所占的字节数;而对于函数,编译器根据其函数体生成相应的代码,再通过其决定所划分的内存空间大小)。

值得一提的就是,在C和C++中,我们可以在多个地方声明相同的变量或函数,但定义只能进行一次。一旦出现了多个相同的定义,编译器将会毫不犹豫的报错。

下面我们来分情况讨论变量和函数的声明与定义的区别。



1.函数的定义和声明

变量的声明实质就是告知编译器该变量的外貌特征。正如前文所述,声明更像是在提醒编译器,这个变量在代码的某个地方出现过。比如下面这条语句:

<span style="white-space:pre">		</span>int x ;
这句话的本意是声明一个整型变量 x ,告知编译器有一个已存在的变量 x 。但同时,这行代码也有足够的信息使得编译器为变量 x 分配一块新的内存单元, 而事实上编译器也确实这么做了。由此可见,正常情况下,变量的声明很容易被当做定义被编译器执行,从而产生不可预知的错误。

幸运的是,在C++中,有一个特定的关键字用来修饰变量,告诉编译器“这里只是一个变量的声明,它的定义在其他的地方”。这个关键字就是extern,它表示该变量是在文件的后面或者是其他文件中定义的。

关键字extern 的用法是:

<span style="white-space:pre">		</span>extern int x ;

在变量定义前加关键字extern表示声明一个变量但不定义他。这个时候编译器不会为整型变量 x 分配单元,而是在代码的其他处寻找该变量的定义。


2.函数的生命和定义

函数的声明是给函数取名,并且指定函数的返回值类型以及参数类型。例如:

<span style="white-space:pre">		</span>int sum(int first , int second) ;
它表示声明了一个名为sum的函数,这个函数会返回一个整型变量,并且这个函数需要两个整型变量作为参数,这两个整型变量参数在该函数中分别被重新定义为整型变量first、整型变量second,最后的分号标志声明结束。

函数的定义方式类似于函数声明,但是区别在于,函数的定义需要函数体,否则编译器无法为该函数分配内存单元。函数体是一个用大括号围起来的代码集,用大括号表示这段代码的开始和结束。例如

<span style="white-space:pre">		</span><pre name="code" class="cpp">int sum(int first , int second)
{
        return first + second ;
}

 
在这段代码中,表示了一个名为sum的函数的定义,它的功能是返回两个整型变量first、second相加的和。并且在函数的定义中,大括号代替分毫的作用,因为大括号表示的是一个语句集。 


而有趣的是,extern也可以用于函数的声明。例如:

extern int sum(int first , int second) ;

关键字extern在修饰变量时非常有效,但遗憾的是,extern对函数来说却是非常多余的。其原因很简单,如果在与语句中出现了函数体,编译器必定会将它视作函数的定义;反之,如果没有出现函数体,编译器也必定会将它视作函数的定义,extern便失去了意义




以上是code::blocks上的测试结果,在函数的定义中,即便加上了extern,编译器识别到函数体之后也会自动的将其视为函数定义。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 《C 程序设计:原理与实践(基础篇)pdf》是一本介绍C程序设计原理与实践的电子书,篇幅为300字。 本书着重介绍了C程序设计的基础知识和实践技巧。首先,书详细介绍了C语言的基本概念、语法规则和编程思想,包括数据类型、运算符、控制语句、函数等。读者通过学习这些内容,可以了解C语言的基本框架和编程范式,为后续的程序设计打下坚实基础。 同时,本书还通过丰富的实例和案例,帮助读者理解C程序设计的实践技巧。例如,介绍了程序的模块化设计思想,如何设计函数和文件结构,以及常见的程序调试和错误处理方法。这些内容对于初学者来说非常有帮助,可以提高编写程序的效率和质量。 此外,本书还详细介绍了C语言的高级特性和应用,如指针、动态内存管理、文件操作等。这些内容对于进一步提高编程能力和解决实际问题非常重要。 综上所述,《C 程序设计:原理与实践(基础篇)pdf》是一本系统、全面介绍C程序设计原理和实践的电子书。通过学习本书,读者可以全面掌握C语言的基本知识和实践技巧,为进一步学习和应用C语言打下坚实基础。 ### 回答2: 《C程序设计:原理与实践(基础篇)pdf》是一本关于C程序设计的教材,旨在帮助读者掌握C语言的基础知识和编程实践技巧。该教材以C语言为基础,通过详细的例子和实践项目,引导读者逐步理解和运用C语言编程。 本教材主要包括以下几个方面的内容: 1. 基本概念与语法:介绍C语言的基本数据类型、运算符、控制流语句等基础知识,并通过多个实例帮助读者熟悉C语言的语法和逻辑。同时,还介绍了一些常用的C库函数,如输入输出函数等。 2. 函数与模块化编程:重点介绍了函数的定义、调用和参数传递等概念,通过实例演示了如何使用函数来解决实际问题。同时,还介绍了如何将程序模块化,以便提高代码的可读性和可维护性。 3. 数组与指针:详细讲解了C语言的数组和指针的概念及其应用。通过实例和练习,引导读者熟练掌握数组和指针的使用方法,并了解它们在C语言的重要性。 4. 结构体与文件操作:介绍了结构体的定义和使用,以及如何通过文件操作来实现数据的读写。这一部分内容帮助读者了解如何处理结构化数据,并掌握文件操作的基本方法。 通过学习《C程序设计:原理与实践(基础篇)pdf》,读者可以获得系统而全面的C语言编程知识,培养编程思维和解决问题的能力。无论是初学者还是有一定编程基础的读者,都能从受益,并逐步提升自己的编程能力。该教材的特点是理论与实践并重,通过大量的实例和练习,帮助读者将理论知识运用到实际编程,从而更好地理解和掌握C语言。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值