12-2. 更复杂的多文件代码

  • 学习人数 30K+
  • 适合所有人群学习
avatar
林耿亮

你好编程主讲老师

在上一节中,我们讨论了简单的多文件程序。实现了在文件main.c中仅需要包含头文件print.h,就可以在文件main.c中使用函数print

文件main.c

#include "print.h"

int main()
{
    print("Hello World\n");
    return 0;
}

文件中main.c中并没有函数print的定义。我们将函数print的定义,抽取到文件print.c中。

文件print.c

#include <stdio.h>

void print(const char *str)
{
    while(*str != '\0')
    {
        putchar(*str);
        str++;
    }
}

而头文件print.h中,写有函数print的声明。

文件print.h

void print(const char* str);

经过预处理和编译、链接后,程序可以正常构建。

构建流程

如果还有其他文件需要使用函数print,像文件main.c那样,包含头文件print.h即可。

这一节中,我们将继续这个话题的讨论。探究一些更复杂的多文件代码。

1. 人员信息录入与显示

我们定义一个人员类型,类型名为Person。它由名称、性别、身高、体重几个成员组成。性别用整型表示,1代表男生、2代表女生。

typedef struct{
    char name[20 + 1];
    int gender;
    double height;
    double weight;
}Person;

姓名的长度限制为20个字符。别忘了,结尾标记'\0'也要占用一个字节的空间。因此,name数组的长度为21。

接着我们定义一个人员信息输入函数。这个函数提示用户输入对应的信息,最后返回一个Person类型的结构。

Person newPerson()
{
    Person p;

    printf("intput name (No more than %d letters):", 20);
    scanf("%s", p.name);

    printf("input gender (1.male 2.female):");
    scanf("%d", &p.gender);

    printf("intput height:");
    scanf("%lf", &p.height);

    printf("intput weight:");
    scanf("%lf", &p.weight);

    return p;
}

显示人员信息使用函数printPerson来完成。

void printPerson(const Person *p)
{
    printf("\nname\tgender\theight\tweight\n");
    printf("%s\t%d\t%.2f\t%.2f\n", p->name, p->gender, p->height, p->weight);
}

在调用函数printPerson时,函数实参将被传递给函数形参。若传递的数据为Person,则需要将整个结构传递进入函数,传递的数据量为sizeof(Person)字节。为了减少数据在函数之间传递的开销,我们将传递结构Person改为,传递指针Person *p进入printPerson函数。改为传递指针后,函数间传递的数据量仅需要sizeof(Person *)字节。指针的大小在32位程序下为4,64位程序下为8。比起传递整个结构,还是小多了。

此外,函数printPerson仅仅是读取各成员数据用于显示,并不会修改任何信息。因此,我们在指针上使用const关键词,限定为只读。保证我们不会误操作而修改了数据。同时,使用这个函数的人看到后,也知道这个函数不会修改Person结构的数据。

最后,函数main中,声明一个Person结构变量。调用上述两个函数录入、显示成员信息。

int main()
{
    Person p;
    p = newPerson();
    printPerson(&p);
    return 0;
}

完成代码如下:

#include <stdio.h>

typedef struct{
    char name[20 + 1];
    int gender;
    double height;
    double weight;
}Person;

Person newPerson()
{
    Person p;

    printf("intput name (No more than %d letters):", 20);
    scanf("%s", p.name);

    printf("input gender (1.male 2.female):");
    scanf("%d", &p.gender);

    printf("intput height:");
    scanf("%lf", &p.height);

    printf("intput weight:");
    scanf("%lf", &p.weight);

    return p;
}

void printPerson(const Person *p)
{
    printf("\nname\tgender\theight\tweight\n");
    printf("%s\t%d\t%.2f\t%.2f\n", p->name, p->gender, p->height, p->weight);
}

int main()
{
    Person p;
    p = newPerson();
    printPerson(&p);
    return 0;
}

人员信息录入显示演示