c语言基础----函数

廉价感情. 提交于 2020-01-17 21:36:14

函数定义

dataType  functionName(){
    //body
}
  • dataType 是返回值类型,它可以是C语言中的任意数据类型,例如 int、float、char 等。
  • functionName 是函数名,它是标识符的一种,命名规则和标识符相同。函数名后面的括号( )不能少。
  • body 是函数体,它是函数需要执行的代码,是函数的主体部分。即使只有一个语句,函数体也要由{ }包围。
  • 如果有返回值,在函数体中使用 return 语句返回。return 出来的数据的类型要和 dataType 一样。

 

内联函数

要将一个函数定义为内联函数,需要在函数定义时加上 inline 函数修饰符。关键字 inline 告诉编译器,任何地方只要调用内联函数,就直接把该函数的机器码插入到调用它的地方。这样程序执行更有效率,就好像将内联函数中的语句直接插入到了源代码文件中需要调用该函数的地方一样。

inline 修饰符并非强制性的:编译器有可能会置之不理。例如,递归函数通常不会被编译成内联函数。编译器有权自行决定是否要将有 inline 修饰符的函数编译成内联函数。

和其他函数不同的是,在每个用到内联函数的翻译单元中,都必须重复定义这个内联函数。编译器必须时刻准备好该函数定义,以便在调用它时及时插入内联代码。因此,经常在头文件中定义内联函数。

如果某个翻译单元内的某个函数的所有声明都具有 inline 修饰符,而没有 extern 修饰符,那么该函数具有内联定义(inline definition)。

内联定义只针对翻译单元,它不构成外部定义,因此别的翻译单元可以包含该函数的外部定义。如果有外部定义附加到内联定义中,那么编译器可以自由选择要使用哪一种定义。

如果使用存储类修饰符 extern 来声明一个采用 inline 定义的函数,那么该函数的定义就会是外部的(external)。例如,下面的声明与 swapf()的定义如果放在例 1 的同一个翻译单元中,那么 swapf()就具有 extern 定义:

extern void swapf( float *p1, float *p2 );

一旦函数 swapf()具有外部的定义,其他翻译单元只需要采用普通的函数声明,就可以调用它。然而,从别的翻译单元调用函数,将不会被编译成内联函数。

内联函数其实就是普通函数,只不过它们在调用时采用机器码形式。和普通函数一样,内联函数具有自己的地址。如果内联函数使用到宏,预处理器就会展开宏,展开时所用的宏值,取该内联函数在源代码中定义所在位置的宏值。然而,在没被声明为 static 的内联函数中,不应该以静态存储周期的方式来定义可修改的对象。

 

函数调用

//一个文件中包含两个函数
#include<stdio.h>
void butler(void);  //第一次出现
int main(void)
{
    printf("I will summon the butler function.\n");
    butler();       //第二次出现
    printf("Yes.Bring me some tea and writeable DVDs.\n");
    
    return 0;
}
void butler(void)   //第三次出现
{
    printf("You rang,sir?\n");
}

butler()函数在程序中出现了3次

1. void butler(void); 

    第一次是函数原型,告知编译器在程序中要使用该函数,也叫作函数声明

2. butler(); 

    第二次以函数调用的形式出现在main()中

3. void butler(void)

    第三次是函数定义,函数定义即是函数本身的源代码

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!