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