在上一节中,我们讨论了简单的多文件程序。实现了在文件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;
}
