大型程序通常把公开接口放在头文件,把实现放在源文件,再由 main 文件使用这些接口。每个源文件会先独立编译成目标文件,最后由链接器组合成可执行程序。
math_utils.h — 声明共享接口
math_utils.cpp — 提供函数定义
main.cpp — 调用公开函数
头文件与保护宏
头文件保护使用唯一的大写名称。第一次包含时定义保护宏;之后再次包含时,ifndef 条件为假,头文件主体会被跳过。头文件应放声明,而不是会产生多个副本的普通函数定义。
math_utils.h
#ifndef MATH_UTILS_H
#define MATH_UTILS_H
double circle_area(double radius);
int clamp(int value, int minimum, int maximum);
#endif知识测验
题目
头文件保护宏主要防止什么问题?
实现文件与 main
math_utils.cpp
#include "math_utils.h"
#define PI 3.1415926
double circle_area(double radius) {
return PI * radius * radius;
}
int clamp(int value, int minimum, int maximum) {
if (value < minimum) {
return minimum;
}
if (value > maximum) {
return maximum;
}
return value;
}main.cpp
#include <iomanip>
#include <iostream>
#include "math_utils.h"
int main() {
double radius = 3.0;
std::cout << std::fixed << std::setprecision(2);
std::cout << circle_area(radius) << '\n';
std::cout << clamp(125, 0, 100) << '\n';
return 0;
}知识测验
题目
函数声明和函数定义的主要区别是什么?
分别编译,再链接
-c 只编译不链接,生成 .o 目标文件。最后一条命令把目标文件链接为 calculator。修改 main 后可以只重新编译 main,再重新链接。
g++ -Wall -c math_utils.cpp -o math_utils.o
g++ -Wall -c main.cpp -o main.o
g++ main.o math_utils.o -o calculator
# Or compile and link in one command:
g++ -Wall main.cpp math_utils.cpp -o calculator动手练习
拆分数组统计程序
把数组统计程序拆成三个文件。
- 在 stats.h 中用 STATS_H 保护宏声明 min_value 和 max_value。
- 在 stats.cpp 中实现两个函数。
- 在 main.cpp 中创建数组并打印最小值和最大值。
- 用一条 g++ 命令编译并链接全部源文件。