C语言学习-第七章 利用函数实现模块化程序设计⑦

240 阅读3分钟

一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第23天,点击查看活动详情

关于变量的声明和定义

一个函数一般由两部分组成:声明部分执行语句

声明部分:作用是对有关的标识符(如变量、函数、结构体、共用体等)的属性进行声明

在声明部分出现的变量有两种情况

  • 一种是需要建立存储空间的(如 "int a;"): 称为定义性声明(defining declaration),或简称定义(defining)
  • 另一种是不需要建立存储空间的(如"extern a;"): 引用性声明(referencing declaration)

建立存储空间的声明称定义,而把不需要建立存储空间的声明称为声明。

内部函数和外部函数

内部函数

如果一个函数只能被本文件中其他函数所调用,它称为内部函数。在定义内部函数时,在函数名和函数类型前加static

static 类型名 函数名(形参表);
static int fun(int a, int b); // fun是一个内部函数,不能被其他文件调用

内部函数又称静态函数,因为它是用static声明的。使用内部函数,可以使函数的作用域只局限于所在文件。

外部函数

如果在定义函数时,在函数首部的最左端加关键字extern,则此函数是外部函数可供其他文件调用

// 如函数说不可以为
extern int fun (int a, int b); // 函数fun可以为其他文件调用

如果在定义函数时省略extern,则默认为外部函数。

在需要调用此函数的其他文件中,需要对此函数作声明。在对此函数作声明时,加上关键字extern,表示该函数“是在其他文件中定义的外部函数”

示例:

#include <stdio.h>

int main() {
// 11. 有一个字符串,内有若干个字符,现输入一个字符,要求程序将字符串中该字符删去. ----- 用外部函数实现
// This is a C program  删掉空格
// 分别定义3个函数来输入字符串 删除字符 输出字符串并分别放在3个文件中
    extern void enter_string(char str[]);// 对函数的声明
    extern void delete_string(char str[], char ch); // 对函数的声明
    extern void print_string(char str[]); // 对函数的声明
//    以上3行声明了本函数中将要调用的已在其他文件中定义的3个函数
    char c, str[80];
    enter_string(str); // 调用在其他文件中定义的 enter_string 函数
    scanf("%c", &c); // 输入要求删除的字符
    delete_string(str, c);
    print_string(str);
    return 0;
}

file1.c

#include <stdio.h>

// 定义外部函数 enter_string
void enter_string(char str[80]) {
    gets(str); // 向字符数组输入字符串
}

file2.c

#include <stdio.h>

// 定义外部函数 delete_string
void delete_string(char str[], char ch) {
    int i, j;
    for (i = j = 0; str[i] != '\0'; i++) {
        if (str[i] != ch) {
            str[j++] = str[i];
        }
    }
    str[j] = '\0';
}

file3.c
```c
#include <stdio.h>

// 定义外部函数 print_string
void print_string(char str[]) {
    printf("%s\n", str);
}

image.png


  • 为什么要用函数
  • 怎样定义函数
  • 调用函数
  • 对被调用函数的声明和函数原型
  • 函数的嵌套调用
  • 函数的递归调用
  • 数组作为函数参数
  • 局部变量和全局变量
  • 变量的存储方式和生存期
  • 关于变量的声明和定义
  • 内部函数和外部函数