C语言:作用域、生存期与多文件工程化开发

一、二维数组作为函数参数

        当二维数组作为函数参数时,需要两个参数(int a[][4],int rows);

其中,在定义数组时,其列数必须赋值,不能省略。例如:

void printfArray(int a[][4],int rows)

二、标识符的作用域与可见性

1.作用域

(1).局部作用域:变量定义在函数或代码模块(如:if,for等)内,仅在该范围有效,出范围则“失效”。其中,函数形参也属于局部作用域。

(2).全局作用域:变量定义在所有函数外(代码最外层),作用域从定义处到本文件结束,可跨函数访问。

<注意>:全局变量可用来传参,存在于静态区,若未对其进行初始化,则均为0。例如;

#include
int a;    //a为全局变量

int b;    //b为全局变量 

int add(void)

{

    return a + b;

}

int main(void)
{
    int a,b;
    printf("%d\n",add(a,b));
    return 0;
}

其输出结果为0。

2.可见性规则

(1)标识符必须先定义后使用。

(2)  在没有包含关系的两个不同作用域中定义的同名标识符互不影响。

(3)  在同一作用域中,不得定义同名标识符。

(4) 在两个域或多个具有包含关系的作用域中定义的同名标识符,外层标识符在内层不可见。——"就近原则"

三、变量存储类型域生存期

1.生存期分类

(1) 静态生存期:变量随程序启动分配内存,程序结束才释放,与整个程序的运行周期相等。

        (如:全局变量、static修饰的变量)

(2)动态生存期:变量在代码块或函数执行时临时分配内存,执行结束即释放(如:普通局部变量auto,可省略auto关键字)。

2.关键存储类型

(1)auto变量:默认局部变量,动态分配内存,作用域/生存期限于代码块。

(2)static变量:

        <1>修饰局部变量:转变为静态生存期(程序运行期始终存在),但作用域仍限于局部;多次调用代码块时,值会保留上一次结果。

        <2>修饰全局变量/函数:限制作用域为当前文件,其他文件无法访问(避免跨文件冲突)。

(3) register变量:建议编译器将变量存储在寄存器,加速访问;注意:寄存器变量无法用&取地址。

四、多文件编程(工程化基础)

(1) 核心文件分工

        <1> .c 文件:写函数/变量的定义(如 int add() { })

        <>   .h文件:写函数/变量的声明

        extern int add()

(2)编译和链接流程

       1>编译命令

        <1>创建main.c主函数,vi main.c

        <2>创建一个垂直分屏的fun.c函数,用来存放被调用的函数;在fun.c文件上方分屏一个fun.h文件,用来存放声明。

       在main.c命令行输入 :vsp fun.c   //此指令创建了一个垂直分屏的fun.c的文件

       在其fun.c的命令行输入  :set mouse=a   //此指令可以使得光标可以在两个文件中自由移动和编辑。

        在fun.c的命令行输入  sp fun.h  //此指令可在fun.c文件上方分屏一个fun.h文件,用来存放声明

        <3>编译(在主程序中,使用需先声明)

        保存各文件后,输入 gcc -oapp main.c fun.c   //合并编译生成可执行文件。

        2>跨文件调用

        若要在 main.c 用 fun.c的变量/函数,需在main.c中包头文件

        #include"fun.h"  //包含头文件,获取声明。

        补充: 

        在fun.h中用extern声明变量/函数(如 extern int);

         限制作用域:若全局变量/函数仅想在当前.c文件使用,加static修饰(如 static int --;)

你可能感兴趣的:(C语言:作用域、生存期与多文件工程化开发)