确保头文件多次包含仍能安全工作的常用技术是预处理器。
C++程序还会用到一项预处理功能的头文件保护符,头文件保护符依赖于预处理变量。
预处理变量有两种状态:已定义和末定义。
#define指令把一个名字设定为预处理变量。
#ifdef和#ifndef这两个分别检查某个指定的预处理变量是否已定义:#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.00;
};
#endif第一次包含Sales_data.h 时,#ifndef的检查结果为真,预处理器将顺序执行后面的操作直到遇到#endif为止。 此时,预处理变量SALES_DATA_H的值将变为已定义,而且Sales_data.h 也会被拷贝到我们的程序中来,后面如果再一次包含Sales_data.h ,则#ifndef的检查结果为假,编译器将忽略#ifndef到#endif之间的部分。
预处理变量无视C++语言中关于作用域的规则。
建议:头文件即使没有被包含在任何其他头文件中,也应该设置保护符,只要习惯性加上就行了。
版权声明:本文为m0_57035799原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。