Skip to content
Word Count: 344 | Expected Read Time: 1 min

ECE244笔记-2-程序结构与编译·头文件卫士

程序结构

当程序逐渐变大变复杂, 将所有函数实现和定义放置在一个.cpp文件中就会变得不现实. 于是, 我们便需要将函数实现和定义分别放置在不同文件中.

分离后的项目结构大致如下

  1. main.cpp The main function
  2. module1.h 模块1的函数定义
  3. module1.cpp 模块1中函数定义的实现

对于用户定义的头文件, 使用如下方式导入

1
#include "module1.h" //注意用双引号而非尖括号

编译步骤

直接编译为可执行文件

1
g++ main.cpp print.cpp input.cpp -o main

分步编译

1. 编译单个模块

1
g++ -c module1.cpp

2. 链接

1
g++ main.o module1.o module2.o -o main

价值, 为何不直接include cpp

正常 #include .h:改 .cpp 实现时,只需要重新编译这个 .cpp,其他文件不用动。
如果 #include .cpp:改这个 .cpp 后,所有 include 它的文件都得重编,而且还可能因为函数被定义多次导致链接报错。

如何避免重复导入头文件

可以通过在头文件中加入 Header Guards 来规避这个问题

1
2
3
4
5
6
#ifndef FILE_NAME_H
#define FILE_NAME_H

// Contents of the header file

#endif
  1. #ifndef FILE_NAME_H 判断该头文件之前是否被定义过, 定义过则不进入该分支
  2. #define FILE_NAME_H define头文件
  3. #endif 结束该if分支

About this Post

This post is written by Jinyuan Zhou, licensed under CC BY-NC 4.0.

#C/C++ #ECE244