避免头文件重复引入

#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 是支持的(不要说那些巨古老的版本)