• 为了确保各个文件中类的定义一致,类通常被定义在头文件中,而且类所在头文件的名字应与类的名字一样。
  • 头文件通常包含那些只能被定义一次的实体、如类、const和constexpr变量。

tip:头文件一旦改变,相关的源文件必须重新编译以便获取更新过的声明。

预处理概述

SRE实战 互联网时代守护先锋,助力企业售后服务体系运筹帷幄!一键直达领取阿里云限量特价优惠。

确保头文件多次包含仍能安全工作的常用技术是预处理器,当预处理器看到#include标记时就会用指定的头文件的内容代替#include。

头文件保护符依赖于预处理变量。

预处理变量有两种状态:

  • 已定义
  • 未定义

#define指令把一个名字设定为预处理变量

#ifdef当且仅当变量已定义时为真

#ifndef当且仅当变量未定义时为真

一旦检查结果为真,则执行后续操作直至#endif指令为止。

使用这些就能有效有效防止重复包含的发生:

#ifndef SALES_DATA_H
#define SALES_DATA_H
#include <string>
struct Sales_data
{
    std::string bookNo;
    unsigned units_sold = 0;
    double revenue = 0.0;
};
#endif

第一次包含Sale_data.h时,#ifndef的检查结果为真,预处理将顺序执行后面的操作直至遇到#endif为止。

预处理变量SALES_DATA_H的值将变为已定义,而且Sales_data.h也会被拷贝到我们的程序中。

后面如果再一次包含Sale_data.h,则#ifndef的结果为假,编译器将忽略#ifndef到#endif之间的部分。

整个程序中的预处理变量包括头文件保护符必须唯一,通常的做法是基于头文件中类的名字来构建保护符的名字,以确保其唯一性。为了避免与程序中的其他实体发生名字冲突,一般把预处理变量的名字全部大写。

扫码关注我们
微信号:SRE实战
拒绝背锅 运筹帷幄