C语言 您所在的位置:网站首页 声明函数的几种方法 C语言

C语言

2023-12-25 16:14| 来源: 网络整理| 查看: 265

函数概念

函数是C语言的功能单位,实现一个功能可以封装一个函数来实现。定义函数的时候一切以功能为目的,根据功能去定函数的参数和返回值。

函数的分类

1、从定义角度分类(即函数是谁实现的)

​ 1.库函数(c语言实现的)

​ 2.自定义函数(程序员自己实现的函数)

​ 3.系统调用(操作系统实现的函数)

2、从参数角度分类

​ 1.有参函数:函数有形参,可以是一个,或者多个,参数的类型随便,完全取决于函数的功能。

​ 2.无参函数:函数没有参数,在形参列表的位置写一个 viod 或什么都不写。

3、从返回值角度分类

​ 1.带返回值的函数:在定义函数的时候,必须带着返回值类型,在函数体里,必须有 return ,如果没有返回值类型,默认返回整型。

注:1.在定义函数的时候,函数的返回值类型,到底是什么类型取决于函数的功能

​ 2.没有返回值的函数:在定义函数的时候,函数名字前面加 void ,在函数里不需要 return。如果想结束函数,返回到被调用的地方,return ;什么都不返回就可以了。

函数的定义

1、函数的定义方法

返回值类型 函数名字(形参列表) { //函数体,函数的功能在函数体里实现 }

注意:形参必须带类型,而且以逗号分隔。函数的定义不能嵌套,即不能在一个函数体内定义另一个函数。

函数的声明

1、对已经定义的函数,进行说明,函数的声明可以声明多次

2、为什么要声明:有些情况下如果不对函数进行声明,编译器在编译的时候,可能不认识这个函数,以为编译器在编译C程序的时候,从上往下编译的。

3、声明的方法:什么时候需要声明,主函数和被调函数在同一个 .c文件的时候;(1)、被调函数在上,主函数在下,这种情况下不需要声明。(2)、被调函数在下,主调函数在上,这种情况编译器从上往下编译,在 main 函数(主调函数),不认识被调函数,需要声明。

直接声明:将被调函数的第一行拷贝过去,后面加分号

间接声明:将函数的声明放在头文件中, .c程序包含文件即可。

主调函数和被调函数不在同一个 .c文件的时候一定要声明。直接声明将被调函数的第一行拷贝过去,后面加分号,前面加 extern。间接声明将函数的声明放在头文件中, .c程序包含文件即可。

函数的调用

函数的调用方法

变量=函数名(实参列表);//带返回值的 函数名(实参列表); //不带返回值的

1、有无返回值

​ 1.有返回值的,根据返回值的类型,需要在主函数中定义一个对应类型的变量,接收返回值

​ 2.没有返回值的函数,不需要接收返回值

2、有无形参

函数名(实参列表);//带形参的 函数名();//没有形参的

注意:实参,可以常量,可以变量,或者表达式。形参变量,是被调函数的局部变量。

函数总结 C语言编译过程

1、预编译:将 .c中的头文件展开、宏展开,生成的文件是 .i文件

2、编译:将预处理之后的 .i文件生成 .s汇编文件

3、汇编:将 .s汇编文件生成 .o目标文件

4、链接:将 .o文件链接成目标文件

include

#iniclude //用尖括号包含头文件,在系统指定的路径下找头文件。

#include"" //用双引号包含头文件,闲杂当前目录下找头文件,找不到,再到系统指定的路径下找。

注意:include 经常用来包含头文件,可以包含 .c文件,但尽量不要包含 .c。因为include包含的文件会在预编译被展开,如果一个 .c被包含多次,展开多次,会导致函数重复定义,所以不要包含 .c文件。

注意:预处理只对 include等预处理操作进行处理并不会进行语法检查,有语法错误也不会报错,在编译阶段才进行语法检查。

defiine

宏定义用 define 去定义,宏是在预编译的时候进行替换。

1、不带参宏

#define 标识符 字符串

在预编译的时候如果代码出现了标识符就用字符串去替换。

宏的优点:只要修改宏定义,其他地方在预编译的时候就会重新替换。

注意:宏定义之后不要加分号

宏定义的作用范围:从定义的地方到本文件末尾。

如果想在中间终止宏的的定义范围使用 #undef 标识符

2、带参宏

#define 宏名(形参) 字符串

注意:带参宏的形参没有类型名

宏名(实参)将来在预处理的时候替换成实参替代字符串中的形参,其他字符保留。

注意:带参宏是在预处理的时候进行替换

3、带参宏和带参函数的区别

带参宏被调用多次就会展开多次,执行代码的时候没有函数调用的过程,不需要压栈弹栈。所以带参宏是浪费了空间,因为被展开多次,节省时间。

带参函数,代码只有一份,存在代码段,调用的时候去代码段取指令,调用的的时候需要压栈弹栈。有个调用的过程。所以说,带参函数浪费时间,节省空间

带参函数的形参是有类型的,带参宏的形参没有类型名。

选择性编译

1

#ifdef xxx 代码一 #else 代码二 #endif

如果在当前 .c ifdef之前定义过xxx,就编译代码一,否则编译代码二。

注意:和if……else语句的区别,if……else语句都会被编译,通过条件选择性执行代码,而选择性编译,只有一块代码被编译。

2

#ifndef xxx 代码一 #else 代码二 #endef

和第一种互补。这种方法,经常用在防止头文件重复包含。

3、

#if 表达式 程序一 #else 程序二 #endif

如果表达式为真,编译第一段代码,否则编译第二段代码。选择性编译都是在预编译阶段处理的。



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有