欢迎光临
我们一直在努力

我的编程之路:函数的声明定义及多文件概念

一,声明定义

       在数学界中,函数的使用一般有其固定架构,如一次函数,二次函数等。他们均有其一般形式,通过一般式方能够在后期灵活套用。而在C语言中,函数一样如此。

       我们在调用某些函数时,需要先声明,以此证明该函数存在,编译器才能够读懂,从而不会报错。无论是自定义函数还是库函数均是如此(库函数的声明由编译器/标准库提供,开发者无需自己编写,只需引入头文件就能调用,头文件的本质就是集中存放函数声明、宏定义、结构体的文件)。

1.函数的声明:是在告诉编译器,有一个函数叫什么,参数是什么,返回类型是什么,函数是存在的
2.在函数的声明中,参数的名字可以不写

  为了能够更好的理解函数的声明和定义关系,在这里,我们以判断闰年为例,写一段代码:

#include<stdbool.h>

#include<stdio.h>
bool is_leap_year(int y);//此处省略参数名

int main()
{
    int year = 0;
    scanf("%d", &year);
    if (is_leap_year(year))//函数的调用
        printf("闰年\\n");
    else
        printf("平年\\n");

    return 0;
}

bool is_leap_year(int y)//函数的调用
{
    if ((y % 4 == 0 && y % 100 != 0) || (y % 400 == 0))
        return true;
    else
        return false;
}

      由上述代码不难看出,bool is_leap_year(int y);为函数的声明,最后一段函数为函数的定义,是函数主体的处理逻辑(头文件可以看作为库函数的声明)。

当然,若无函数的声明也可以,只要把函数的定义写在前就行。

#include<stdbool.h>

#include<stdio.h>

bool is_leap_year(int y)//函数的定义
{
if (((y % 4 == 0) && y % 100 != 0)) || (y % 400 == 0))
        return true;
    else
        return false;
}

int main()
{
    int year = 0;
    scanf("%d", &year);
    if (is_leap_year(year))//函数的调用
        printf("闰年\\n");
    else
        printf("平年\\n");

    return 0;
}

编译器读取代码是从上往下依次读取的,由此亦可看出,函数的定义是特殊的声明。

再以简单加法为例:

//函数的声明
//int Add(int x, int y);
//
//int main()
//{
//    int n = 0;
//    int m = 0;
//    scanf("%d%d", &n, &m);
//    int i = Add(n, m);//函数的调用
//    printf("%d\\n", i);
//
//    return 0;
//}
//
////函数的定义
//int Add(int x, int y)
//{
//    return x + y;
//}

二,多文件概念及使用

      我们在日常的学习中,或许不会接触多文件,而真正的可视化反馈是在一些公司或团体中协作编写代码时。

       C语言多文件编程是将程序按功能模块拆分到多个 .c 源文件和 .h 头文件中,核心解决单文件代码冗长、维护难、复用性低的问题,是C语言项目开发的标准写法,核心遵循头文件做声明,源文件做实现的规则。

1. 头文件(.h):仅做“接口声明”,不写实现

2. 源文件(.c):仅做“功能实现”,配合头文件

3. 主文件(.c):程序入口,代码主体

接下来我用几张截图来具象化它:

        此图我们继续以简单加法为例,新建点.c及.h文件,并将函数的定义及函数的声明放进去,代码正常运行。

      该用法的好处是可以分开这几部分来编写代码,也就是可以多人同时分工写代码。这在我们平时的学习当中似乎多此一举,然而,在一些团体比赛或创作,乃至于公司企业多人分工做项目中,都发挥着举足轻重的作用。

比如一个公司要写一个计算器,员工b负责写加法,员工c负责写减法,员工d负责写乘法,员工e负责写除法,而员工a则将整合所有代码并写函数主体,从而完成一个大型项目计算器(在这里假设大型项目是计算器)。

      需要补充的是,如果函数的声明及定义与主函数分部化,便需要自己创建头文件,而自己创建的头文件使用引号包含。

如:#include"add.h", 解决了函数声明的问题。

      当然,如果缺少了add.h文件中的声明,代码一样可以运行,在单文件中,函数的定义需要在函数主体之前充当声明,而在多文件中可以直接运行,只不过VS会警告,你的自定义函数未定义。

       多文件的好处还有很多,比如一些大型游戏公司需要能够支持游戏运行的游戏引擎,会购买一些游戏引擎版权。然而,卖版权的公司,为了保证自己能够每年获利,便会隐藏自己类似自定义函数部分的处理和逻辑,只把类似add.h和函数主体明示给游戏公司,隐藏的部分会用“静态库”处理。

      这样的话,类似自定义函数的处理和核心逻辑,就会以乱码的形式呈现给游戏公司,除非游戏公司反编译(盗版),否则,其将无法获取核心内容,只有使用权。

       游戏公司作为甲方,只需要在自己的主体函数中导入静态库, 并将卖家的头文件和函数主体以.lib形式,拷贝到自己文件中,便只有使用权,查看.lib文件只会出现一堆乱码。

我在这里具体模拟演示一遍:

1,将卖家提供的游戏引擎拷贝到自己文件中。

2,在自己文件中导入卖家的静态库。

3,试运行后出现警告。

四,此时你的add文件中多出文件。

五,你尝试打开add.ilb文件,出现乱码。

      总而言之,多文件在具体的生活中有丰富的应用,他在公司,保护自身版权及利益上发挥着巨大作用。

      感谢阅读。

赞(0)
未经允许不得转载:171主机测评 » 我的编程之路:函数的声明定义及多文件概念
分享到: 更多 (0)

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址