C语言进阶43:函数的意义——模块化设计和extern

函数的由来:

    程序 = 算法 + 数据

  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对程序单元进行声明


猜你喜欢

转载自blog.csdn.net/qq_28388835/article/details/80380619