MW211 EXIT

devlog
C/ヘッダファイルのインクルード
2014年07月24日
ヘッダファイルのインクルードをソースファイル側でするべきか
インクルードしているヘッダファイル側でするべきか迷うことがある。

ということでまとめた。
 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
【1】公開関数や公開グローバル変数を使用する場合
┌──┬───────────────────────────────────┐
│①.h│extern void 公開関数①();                                             │
├──┼───────────────────────────────────┤
│①.c│#include "①.h"                                                       │
│    │void 公開関数①()                                                     │
│    │{                                                                     │
│    │    処理;                                                             │
│    │}                                                                     │
└──┴───────────────────────────────────┘
┌──┬───────────────────────────────────┐
│②.c│#include "①.h"                                                       │
│    │公開関数①();                                                         │
└──┴───────────────────────────────────┘
  ②ではソースファイル側でインクルードする。
  →②のヘッダファイルでインクルードし、
    そのヘッダファイルをソースファイルでインクルードするといった
    まわりくどいことはしなくてもよい
 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
【2】define定義はtypdef定義をヘッダ側でも使用する場合
┌──┬───────────────────────────────────┐
│①.h│typedef int 新型;                                                     │
└──┴───────────────────────────────────┘
┌──┬───────────────────────────────────┐
│②.h│#include "①.h"                                                       │
│    │extern void 公開関数②(新型 arg);                                     │
├──┼───────────────────────────────────┤
│②.c│#include "②.h"                                                       │
│    │void 公開関数②(新型 arg)                                             │
│    │{                                                                     │
│    │    処理;                                                             │
│    │}                                                                     │
└──┴───────────────────────────────────┘
┌──┬───────────────────────────────────┐
│③.c│#include "②.h"                                                       │
│    │新型  arg = 0;                                                        │
│    │公開関数②(arg);                                                      │
└──┴───────────────────────────────────┘
  ②のヘッダファイルにとって、①のヘッダファイルは必須なので
  ②ではヘッダファイル側でインクルードする。
  →別の③が、②のヘッダファイルのみをインクルードすれば
    完結する(①のヘッダファイルのインクルードがなくてもよい状態)ように
    なっていればよい
 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
分類:C/C++