aytony

求古寻论,散虑逍遥。

0%

C++多文件工程

文件组成

C++工程一般不把所有代码放在同一文件中,而是将其拆分为多个耦合度低的模块,并放在多个.h-.cpp文件对下。对于含模板的类和函数,其定义直接置于.h文件中,取消.cpp文件。

某项目文件结构

头文件

头文件如果被多个源文件包含,可能会被重复编译多次,而产生链接错误。为解决此问题,一般采取两个解决办法。

第一,头文件内不放置static或全局const以外变量的定义,从而避免符号链接。

第二,利用预处理语句做好头文件保护。

1
2
3
4
5
6
7
8
9
// example_header.hpp
#ifndef EXAMPLE_HEADER_HPP
#define EXAMPLE_HEADER_HPP

...
// some codes
...

#endif // EXAMPLE_HEADER_HPP

以上预处理语句在文件起始检测宏EXAMPLE_HEADER_HPP是否被定义,如果没有被定义则展开头文件开始编译,否则直接跳过头文件的编译过程。这样可以保证即便头文件被重复编译,最终也只会被展开一次。更简单的,现代编译器一般可以用以下语句做到相同目的。

1
#pragma once

以上语句置于头文件第一行,可以让编译器只展开头文件一次,效果与宏定义相同。

命名空间保护

为了避免自行定义的函数和类与标准库冲突,建议对于项目中所有函数、类、枚举等成员定义于项目命名空间之内。

1
2
3
4
namespace project_example
{
enum class my_enum {a, b, c};
}