在 C++ 编程中,头文件(通常以 .h 或 .hpp 结尾)起着至关重要的作用。它们主要用于实现声明与定义的分离,支持模块化开发。
头文件主要承担以下职责:
一个规范的头文件必须包含头文件保护符 (Header Guards),以防止被重复包含导致的编译错误。
有两种常见写法:
写法 A:传统的宏定义保护 (标准写法)
#ifndef MY_MODULE_H #define MY_MODULE_H // ... 代码内容 ... #endif // MY_MODULE_H
写法 B:编译器指令 (现代写法)
#pragma once // ... 代码内容 ...
注:``#pragma once`` 更简洁,虽然不是标准 C++,但目前几乎所有主流编译器都支持。
假设我们要编写一个简单的数学工具模块。
#ifndef MATH_UTILS_H #define MATH_UTILS_H #include <vector> // 引入必要的标准库 namespace MyLib { // 1. 常量声明 (使用 extern) extern const double PI; // 2. 类声明 class MathUtils { public: MathUtils(); int add(int a, int b); static double calculateAverage(const std::vector<int>& numbers); private: int internalValue; }; // 3. 模板函数 (必须在头文件中实现) template <typename T> T max(T a, T b) { return (a > b) ? a : b; } } #endif // MATH_UTILS_H
#include "MathUtils.h" #include <numeric> namespace MyLib { // 1. 变量定义 const double PI = 3.1415926; // 2. 类成员函数实现 MathUtils::MathUtils() : internalValue(0) {} int MathUtils::add(int a, int b) { return a + b; } double MathUtils::calculateAverage(const std::vector<int>& numbers) { if(numbers.empty()) return 0.0; double sum = std::accumulate(numbers.begin(), numbers.end(), 0.0); return sum / numbers.size(); } }
#include <iostream> #include "MathUtils.h" int main() { MyLib::MathUtils utils; std::cout << "1 + 2 = " << utils.add(1, 2) << std::endl; std::cout << "Max value: " << MyLib::max(10, 20) << std::endl; return 0; }
在使用头文件时,请遵循以下原则: