函数定义与声明

对函数的“定义”和“声明”不是一回事。“定义”是指对函数功能的确立,包括指定函数名,函数值类型、形参类型、函数体等,它是一个完整的、独立的函数单位。而“声明” 的作用则是把函数的名字、函数类型以及形参类型、个数和顺序通知编译系统,以便在调用该函数时系统按此进行对照检查(例如函数名是否正确,实参与形参的类型和个数是否一致)。从程序中可以看到对函数的声明与函数定义中的函数首部基本上是相同的。因此可以简单地照写已定义的函数的首部,再加一个分号,就成为了对函数的“声明”。在函数声明中也可以不写形参名,而只写形参的类型。 在C语言中,函数声明称为函数原型(function prototype)。使用函数原型是ANSI C的一个重要特点。它的作用主要是利用它在程序的编译阶段对调用函数的合法性进行全面检查。

说明:

以前的C版本的函数声明方式不是采用函数原型,而只是声明函数名和函数类型。

如:float add(); 不包括参数类型和参数个数。系统不检查参数类型和参数个数。新版本也兼容这种用法,但不提倡这种用法,因为它未进行全面的检查。

实际上,如果在函数调用前,没有对函数作声明,则编译系统会把第一次遇到的该函数形式(函数定义或函数调用)作为函数的声明,并将函数类型默认为int 型。如一个max函数,调用之前没有进行函数声明,编译时首先遇到的函数形式是函数调用"max(a, b)",由于对原型的处理是不考虑参数名的,因此系统将max()加上int作为函数声明,即int max(); 因此不少教材说,如果函数类型为整型,可以在函数调用前不必作函数声明。但是使用这种方法时,系统无法对参数的类型做检查。或调用函数时参数使用不当,在编译时也不会报错。因此,为了程序清晰和安全,建议都加以声明为好。

如果被调用函数的定义出现在主调函数之前,可以不必加以声明。因为编译系统已经先知道了已定义的函数类型,会根据函数首部提供的信息对函数的调用作正确性检查。

如果已在所有函数定义之前,在函数的外部已做了函数声明,则在各个主调用函数中不必对所调用的函数再作声明。

对函数的“定义”和“声明”不是一回事。“定义”是指对函数功能的确立,包括指定函数名,函数值类型、形参类型、函数体等,它是一个完整的、独立的函数单位。而“声明” 的作用则是把函数的名字、函数类型以及形参类型、个数和顺序通知编译系统,以便在调用该函数时系统按此进行对照检查(例如函数名是否正确,实参与形参的类型和个数是否一致)。从程序中可以看到对函数的声明与函数定义中的函数首部基本上是相同的。因此可以简单地照写已定义的函数的首部,再加一个分号,就成为了对函数的“声明”。在函数声明中也可以不写形参名,而只写形参的类型。 在C语言中,函数声明称为函数原型(function prototype)。使用函数原型是ANSI C的一个重要特点。它的作用主要是利用它在程序的编译阶段对调用函数的合法性进行全面检查。

说明:

以前的C版本的函数声明方式不是采用函数原型,而只是声明函数名和函数类型。

如:float add(); 不包括参数类型和参数个数。系统不检查参数类型和参数个数。新版本也兼容这种用法,但不提倡这种用法,因为它未进行全面的检查。

实际上,如果在函数调用前,没有对函数作声明,则编译系统会把第一次遇到的该函数形式(函数定义或函数调用)作为函数的声明,并将函数类型默认为int 型。如一个max函数,调用之前没有进行函数声明,编译时首先遇到的函数形式是函数调用"max(a, b)",由于对原型的处理是不考虑参数名的,因此系统将max()加上int作为函数声明,即int max(); 因此不少教材说,如果函数类型为整型,可以在函数调用前不必作函数声明。但是使用这种方法时,系统无法对参数的类型做检查。或调用函数时参数使用不当,在编译时也不会报错。因此,为了程序清晰和安全,建议都加以声明为好。

如果被调用函数的定义出现在主调函数之前,可以不必加以声明。因为编译系统已经先知道了已定义的函数类型,会根据函数首部提供的信息对函数的调用作正确性检查。

如果已在所有函数定义之前,在函数的外部已做了函数声明,则在各个主调用函数中不必对所调用的函数再作声明。


相关文章

  • extern与头文件(h)的区别和联系
  • 用#include可以包含其他头文件中变量.函数的声明,为什么还要extern关键字? 如果我想引用一个全局变量或函数a,我只要直接在源文件中包含#include (xxx.h包含了a的声明)不就可以了么,为什么还要用extern呢?? 这 ...查看


  • 虚,纯虚等的概念
  • 1. 析构函数和虚析构函数 如果基类的析构函数是虚的,那么它的派生类的析构函数都是虚的 这将导致:当派生类析构的时候,它的所有的基类的析构函数都将得到调用 否则,只调用派生类的析构函数(这可能导致基类的某些对象没有得到释放) 所以CObje ...查看


  • C++类和对象的定义
  • 类和对象 类的定义 1 类的定义可以分为两部分:说明部分和实现部分.说明部分说明类中包含的数据成员和成员函数,实现部分是对成员函数的定义.类定义的一般格式如下: //类的说明部分 class<类名> { public: < ...查看


  • C++ 重载运算符和重载函数
  • C++ 允许在同一作用域中的某个函数和运算符指定多个定义,分别称为函数重载和运算符重载. 重载声明是指一个与之前已经在该作用域内声明过的函数或方法具有相同名称的声明,但是它们的参数列表和定义(实现)不相同. 当您调用一个重载函数或重载运算符 ...查看


  • js权威指南 读书笔记
  • 第一章 词法结构 Js 是用Unicode 字符集编写的:js 区分大小写,而html 不区分:直接量:标志符合保留字:分号可选,注意良好的编程习惯. 第二章 类型.值和变量 1. 数字 Js 不区分整数值和浮点数值,所有值都用浮点数值表示 ...查看


  • C++程序设计实验5-8
  • 实验五 构造函数与析构函数的编程 一.实验目的 1.进一步加深对类和对象的理解. 2.掌握类的构造函数和析构函数的概念.意义和使用方法. 3.掌握重载构造函数的含义和使用. 4.编写一个较为复杂的类和对象的应用程序. 二.实验内容 1.设计 ...查看


  • c语言函数的作用
  • C 语言函数(Function )及其知识点 绍兴文理学院 沈红卫 C 语言是函数的语言.这话的内涵很丰富,个人以为,可从以下几个方面去理解和把握函数这部分内容,领会此话的意义. 一.小函数大程序 意思是说,一个C 语言程序可以很大,但是通 ...查看


  • C引用的作用和用法
  • 本文由zpwodeaia贡献 doc文档可能在WAP端浏览体验不佳.建议您优先选择TXT,或下载源文件到本机查看. C++ 引用的作用和用法 引用就是某一变量(目标)的一个别名, 引用就是某一变量(目标)的一个别名,对引用的操作与对变量直 ...查看


  • AT89C51单片机控制四相步进电动机程序
  • /************************************************************函数说明:通过AT89C51单片机控制四相步进电动机功能说明:通过正转(P2^0).反转(P2^1)键的作用,实现相应 ...查看


热门内容