C语言中的函数函数的由来程序 = 数据 + 算法==>C程序 = 数据 + 函数 (定义算法)函数的意义模块化程序设计C语言中的模块化面向过程的程序设计面向过程是一种以过程为中心的编程思想首先将复杂的问题分解为一个个容易解决的问题分解后的问题可以按照步骤一步步完成函数是面向过程在 C 语言中的体现解决问题的每个步骤可以用函数来实现声明和定义声明的意义在于告诉编译器程序单元的存在定义则明确指示程序单元的存在C 语言中通过 extern 进行程序单元的声明一些程序单元在声明时可以省略 extern严格意义上的声明和定义并不同实例分析: 声明和意义不同实验 1test.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; printf(“p = %p\n”, p); 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);}输出:p = (nil)g_var = 10i + j = 3g(3) = 16实验 2test.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 = (struct test*)malloc(sizeof(struct Test)); // 注意这里! printf(“p = %p\n”, p); 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:13: error: invalid application of ‘sizeof’ to incomplete type ‘struct Test’ test.c:13: warning: initialization from incompatible pointer type发生了什么?在链接阶段之前,各个文件之间的编译是互相独立的。test.c 中,对 struct Test 进行声明,仅告诉编译器其定义于其它文件,但在本文件中,无法获取它的详细信息,sizeof()不知道返回怎样的值,因此报错。实验 3test.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; printf(“p = %p\n”, p); 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>float 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);}输出:p = (nil)g_var = 1092616192i + j = 3g(3) = 16 发生了什么?在global.c定义为 float ,test.c 声明为 int ,编译器没有发出警告!;global.c 中,g_var 内存空间中 4 字节二进制数据将按照 float 类型进行解释;test.c 中,g_var 内存空间中 4 字节二进制数据将按照 int 类型进行解释;在 c 语言中, float 与 int 的存储方式不同,导致输出不同。小结函数是面向过程思想在 C 语言中的体现面向过程是由上至下分解问题的设计方法程序中的定义和声明完全不同C 语言中通过 extern 对程序单元进行声明以上内容参考狄泰软件学院系列课程,请大家保护原创!