今天听侯捷老师课时,说到写头文件时,基本要防卫式声明,突然感觉很陌生所以搜一些资料,整理一下方便以后自己查看。
头文件中防卫式声明分两种:宏定义和编译器指令
宏定义:
#ifndef __COMPLEX__
#define __COMPLEX__
//.......
#endif
编译器指令:
#pragma once
(编译器指令这个因为vs写程序经常用,防止头文件重复包含)
//person.h头文件
class Person
{
public:
Person();
~Person();
private:
};
//student.h头文件
#include"person.h"
class Student
{
public:
Student();
~Student();
private:
};
//main.cpp文件
#include<iostream>
#include"person.h"
#include"student.h"
int main() {
return 0;
}
在运行上边程序时编译器会报错:“Person”:“class”类型重定义
因为编译器在编译时会把相应的头文件按顺序展开,这就导致类Person被定义了两次。
这时候就需要防卫式声明了,它能避免头文件被包含多而导致 一些内容的重复定义。
#ifndef依赖于宏定义名,当宏被定义时,#endif之前的代码会被忽略,但是呢要注意当你内容不同时宏的名字也要防止相同,不然内容可能第二次被过滤了。
#pragm once只能保证一个头文件不会被重复包含 ,但是不同的头文件含相同内容时,编译就会报错。
如果不使用vs编译器的话常用的还是宏形式的,这样可以使代码跨平台使用。