函数是一组一起执行一个任务的语句。每个C程序都至少有一个函数,即主函数main(),所有简单的程序都可以定义其他额外的函数
一、函数的由来
二、模块化程序设计
三、C 语言中的模块化
四、面向过程的程序设计
- 面向过程是一种以过程为中心的编程思想
- 首先将复杂的问题分解为一个个容易解决的问题
- 分解过后的问题可以按照步骤一步步完成
- 函数是面向过程在 C 语言中的体现
- 解决问题的每个步骤可以用函数来实现
五、声名和定义
- 声明的意义在于告诉编译器程序单元的存在
- 定义则明确指示程序单元的意义
- C 语言中通过 extern 进行程序单元的声明
- 一些程序单元在声明时可以省略 extern
严格意义上的声明和定义并不相同!
下面看一个例子:
test.c:
#include <stdio.h>
#include <malloc.h>
extern int g_var; //声明
extern struct Test; //声明
int main()
{
extern void f(int i, int j); //声明
extern int g(int x); //声明
struct Test* p = NULL; // (struct Test*)malloc(sizeof(struct Test));
printf("p = %p\n", p);
//g_var = 10;
printf("g_var = %d\n", g_var);
f(1, 2);
printf("g(3) = %d\n", g(3));
free(p);
return 0;
}
global.c:
#include <stdio.h>
/*下面都是定义*/
int g_var = 10;
struct Test
{
int x;
int y;
};
void f(int i, int j)
{
printf("i + j = %d\n", i + j);
}
int g(int x)
{
return (int)(2 * x + g_var);
}
输出结果如下:
怎么证明声明和定义不同呢?我们对 test.c 修改成这样,将 struct Test* p = NULL; 改成 struct Test* p = (struct Test*)malloc(sizeof(struct Test));
#include <stdio.h>
#include <malloc.h>
extern int g_var;
extern struct Test;
int main()
{
extern void f(int i, int j);
extern int g(int x);
struct Test* p = (struct Test*)malloc(sizeof(struct Test));
printf("p = %p\n", p);
//g_var = 10;
printf("g_var = %d\n", g_var);
f(1, 2);
printf("g(3) = %d\n", g(3));
free(p);
return 0;
}
可以看到,直接报错:
delphi@delphi-vm:~$ gcc test.c global.c
test.c:6: warning: useless storage class specifier in empty declaration
test.c: In function ‘main’:
test.c:13: error: invalid application of ‘sizeof’ to incomplete type ‘struct Test’
这是因为编译器在 test.c 是找不到 struct Test 的定义的,只有 struct Test 的声明,因此无法知道 struct Test 结构体的信息。(C 语言编译器编译 C 文件的时候不会依赖于文件之间的编译顺序)。
六、小结
- 函数是面向过程思想在 C 语言中的体现
- 面向过程是由上至下分解问题的设计方法
- 程序中的定义和声明完全不同
- C 语言中通过 extern 对程序单元进行声明
到此这篇关于C语言深入探究函数的溯源的文章就介绍到这了,更多相关C语言 函数内容请搜索编程学习网以前的文章希望大家以后多多支持编程学习网!
本文标题为:C语言深入探究函数的溯源


基础教程推荐
- C语言 详解字符串基础 2023-03-27
- C语言编程C++旋转字符操作串示例详解 2022-11-20
- C++实现ETW进行进程变动监控详解 2023-05-15
- C++实战之二进制数据处理与封装 2023-05-29
- 带你深度走入C语言取整以及4种函数 2022-09-17
- [c语言-函数]不定量参数 2023-09-08
- centos 7 vscode cmake 编译c++工程 2023-09-17
- [C语言]二叉搜索树 2023-09-07
- C语言实现宾馆管理系统课程设计 2023-03-13
- 全面了解C语言 static 关键字 2023-03-26