当编译器遇到一个函数调用时,它产生代码传递参数并调用这个函数,而且接收该函数返回的值(如果有的话)。但编译器是如何知道该函数期望接受的是什么类型和多少数量的参数呢?如何知道函数返回值的类型呢?

如果没有关于调用函数的信息,编译器便假定在这个函数的调用时参数的类型和数量是正确的。同时会假定函数将返回一个整型值。对于那些返回值并非整型的函数而言,这种隐式认定常常导致错误。

这种情况,很容易解决,例如可以在调用该函数前定义这个函数,或者调用该函数前声明该函数(今后,函数声明又叫函数原型),解决的办法很多,但上面的两种都不是最好的,特别对于规模较大的程序。

下面介绍函数原型:

向编译器提供一些关于函数的特定信息显然更加安全,我们可以通过两种方法来实现。


首先,如果同一个源文件的前面已经出现了该函数的定义,编译器就会记住它的参数数量和类型,以及函数对的返回值类型。接着,编译器便可以检查该函数的所有后续调用(在同一个源文件中),确保它们是正确的。


第2种向编译器提供函数信息的方法是使用函数原型(function prototype)。原型总结了函数定义的起始部分的声明,向编译器提供有关该函数应该如何调用的完整信息。


使用原型最方便(且最安全)的方法是把原型置于一个单独的文件,当其他源文件需要这个函数的原型时,就使用#include 指令包含该文件。这个技巧避免了错误键入函数原型的可能性,它同时简化了程序的维护任务,因为这样只需要该原型的一份物理拷贝。


举个函数原型的例子:

int *find_int(int key, int array[], int len);

注意后面的那个分号;它区分了函数原型和函数定义的起始部分。


这个技巧(使用#include)比前一种方法的好处在于:

  1. 现在函数原型具有文件作用域,所以原型的一份拷贝可以作用于整个源文件;
  2. 如果函数的定义进行了修改,我们只需要修改原型,并重新编译所有包含了该原型的源文件即可;
  3. 如果函数原型同时也被#include指令包含到定义函数的文件中,编译器就可以确认函数原型与函数定义的匹配。

通过只书写函数原型一致,我们消除了多份原型的拷贝间不一致的可能性。然而,函数原型必须与函数定义匹配。把函数原型包含在定义函数的文件中可以使编译器确认它们之间的匹配。

函数声明(函数原型)的一些关键技巧相关推荐

  1. [OHIF-Viewers]医疗数字阅片-医学影像-中间插播一下-es6-使用const加箭头函数声明函数相对于function声明函数有什么好处?...

    [OHIF-Viewers]医疗数字阅片-医学影像-中间插播一下-es6-使用const加箭头函数声明函数相对于function声明函数有什么好处? 这个好多人都已经写过了,这里插播一下,在OHIF- ...

  2. C++关于函数声明 函数实现

    ExLib 输出为动态库 hpp 文件 #ifndef EXTESTA_HPP #define EXTESTA_HPP#include "ExLib_global.hpp"#inc ...

  3. 函数定义、函数声明、函数原型

    函数定义.函数声明.函数原型:变量声明.变量定义:类型声明.类型定义 1.函数定义.函数声明.函数原型 2.变量声明.变量定义 3.类型声明.类型定义 1.函数定义.函数声明.函数原型 函数声明中不但 ...

  4. 【C语言】函数的声明_函数定义_函数调用_函数递归 [函数的基本使用]

    文章目录 前言 1.函数是什么? 2.C语言中函数的分类 2.1 库函数 2.2 自定义函数 3.函数的参数 3.1 实际参数(实参): 3.2 形式参数(形参): 4.函数的调用 4.1 传值调用 ...

  5. C++ 笔记(13)— 函数(函数声明、函数定义、函数调用[传值、指针、引用]、函数参数默认值、函数重载)

    每个 C++ 程序都至少有一个函数,即主函数 main() ,所有简单的程序都可以定义其他额外的函数. 1. 函数声明 函数声明告诉编译器函数的名称.返回类型和参数.函数声明包括以下几个部分: ret ...

  6. 函数声明和变量声明提升

    var a; // 声明一个变量,标识符为a function a() { // 声明一个函数,标示符也为a } alert(typeof a); 显示的是"function",即 ...

  7. ts 函数声明及泛型函数

    函数声明 函数声明对参数类型, 返回值类型定义,没有返回值定义为void //必传x,y并且类型都为number,返回值为布尔 function fun1(x:number,y:number):boo ...

  8. C++指针详解2_typedef函数声明类型、sizeof特性简介与数组指针间关系说明

    本节主要内容 typedef函数声明 函数指针变量声明类型 函数指针与函数指针数组 sizeof 数组与指针的关系 函数形参接收数组与接收指针的关系 基本函数声明类型与使用 使用typedef进行函数 ...

  9. C语言函数声明、定义、调用

    函数的声明: 就是告诉编译器我要使用这个函数,你现在没有找到它的定义不要紧,请不要报错,稍后我会把定义补上. 有的时候不写声明函数也是可以执行的,但是把函数定义写在函数调用之后就会有提示甚至报错. 函 ...

  10. 函数声明、 函数表达式 与立即调用函数表达式的比较

    函数声明    函数声明创建将来代码调用的函数.函数可以在声明之前的位置被调用.代码样例如下: //可以在声明之前的位置被调用 var size=area(3,6);function area(wid ...

最新文章

  1. 【数据结构】某些难理解点
  2. elegance suites bangkok info
  3. System x迈向更多领域 国内超算步入全面发展时代
  4. Linux内核探秘读书笔记
  5. Lesson 001 —— 数据
  6. Flutter的滚动以及sliver约束
  7. Oracle函数的信息,Oracle中获取会话信息的两个函数分享
  8. 赛锐信息:在云中交付SAP解决方案
  9. Hdu - 2647 - Reward
  10. c++11 多线程编程(六)------条件变量(Condition Variable)
  11. android 呼吸灯权限_Android 呼吸灯效果
  12. es6 属性及常用新属性汇总
  13. Java并发编程实战 -- 读书笔记
  14. CC2500 使用总结
  15. RAC修改IP(public/virtual/scan)
  16. C#中.snk文件的作用【转】
  17. C#,VB.NET如何将Word转换为PDF和Text
  18. 批量大气校正高分2号(GF2)卫星数据
  19. 你的Web系统真的安全吗?
  20. 网络直播算是计算机技术吗,计算机网络技术与电视直播新闻的融合发展

热门文章

  1. mencoder视频旋转
  2. 问题1:程序员要做一辈子?
  3. 掌握 ASP.NET 之路:自定义实体类简介
  4. linux中-i选项的作用,linux – find中的-prune选项有什么作用?
  5. 黔农云认证用别人认证_绝对干货,黔农云常见17个问题答疑!
  6. 学业水平测试计算机都考什么,高中学业水平考试与高中会考有什么区别
  7. 全麦吐司和普通吐司的区别_全麦面包和普通面包的区别
  8. aix解压tgz_AIX 上压缩与解压缩 各种文件格式原理说明
  9. 研究能力培养的阶梯: 盐趣一对一科研项目
  10. 经过标定后的ESP32对于节能信标组充电过程测量