函数的由来:
程序 = 算法 + 数据
C程序 = 数据 + 函数
面向过程的程序设计:
首先 将复杂的问题分解为一个个容易解决的问题
分解过后的问题可以按照步骤一步步完成
函数是面向过程在C语言中的实现
解决问题的每个步骤可以用函数实现
函数声明与函数定义:
声明的意义在于告诉编译器程序单元的存在
定义则明确指示程序单元的意义
C语言中通过extern进行程序单元的声明
一些程序单元在声明时可以忽略extern
我们来看下面代码,体会声明与定义的不同之处:
先定义一个test_O.c文件,定义一些变量和函数
#include <stdio.h> int g_var = 10; //如果改为:float g_var = 10, 则打印g_var的值将出现不确定的结果(float的表示方式是不准确的) 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中使用这些变量和函数:
#include <stdio.h> #include <malloc.h> extern int g_var; //在外部定义,但未告诉编译器是如何定义的。变量的定义伴随着内存的分配,所以在这个地方并不会分配空间 extern struct Test; //在某些情况下,去掉extern也是可以的 int main() { extern void f(int i, int j); extern int g(int x); struct Test* p = NULL; // (struct Test*)malloc(sizeof(struct Test)); //如果用p指向一片堆上的空间,则报错 //因为sizeof结构体类型的大小无法在这个文件中被确定 //我们无法依靠程序被编译的顺序来保证上面代码的合理性 //报错:invalid application of ‘sizeof’ to incomplete type ‘struct Test’ 未完全定义的结构体 printf("p = %p\n", p); //g_var = 10; //error printf("g_var = %d\n", g_var); f(1, 2); printf("g(3) = %d\n", g(3)); free(p); return 0; }
小结:
函数是面向过程思想在C语言中的体现
面向过程是由上至下分解问题的设计方法
程序中的定义和声明完全不同
C语言中通过extern对程序单元进行声明