避免头文件重复引入
#include
的作用是将对应文件直接拷贝过来。这不可避免地会导致某个头文件被拷贝了多次,从而造成重复定义的问题。
目前已知两种解决方法:条件编译 和 pragma once
方法简述
条件编译
条件编译可以让宏拥有判断的特性。
#define CONDITION
#ifdef CONDITION
... // section a
#else
... // section b
#endif
定义了 CONDITION
宏,编译器会只编译 section a 的内容,丢弃 section b。
除此之外,还有 ifndef
elif
等宏。
ifndef 即 if not define
在可能被多次 include 的头文件开头定义一个宏,并将后面所有的内容包裹在 ifdef 中,可以保证 ifdef 宏包裹的内容不被多次 include。
#ifndef __UTILS_H__
#define __UTILS_H__
... // contents of the header
#endif
CLion IDE 在创建头文件时会自动帮你生成这段条件编译
pragma once
使用很简单,在头文件开头加上:
#pragma once
结束。
方法对比
- pragma once 使用更简单
- pragma 某些编译器不支持,用小作坊手搓的编译器可能会寄寄
- gcc, clang 是支持的(不要说那些巨古老的版本)