「インクルードガード」の版間の差分

提供: C++入門
移動: 案内検索
(ページの作成:「インクルードガード (include guard)とは、C/C++のヘッダファイルのインクルードが2回目以降の展開を防ぐためのスキップす...」)
 
 
行1: 行1:
[[インクルードガード]] (include guard)とは、C/C++のヘッダファイルのインクルードが2回目以降の展開を防ぐためのスキップするためにプロプロセッサに指示するテクニックです。
+
[[インクルードガード]] (include guard)とは、C/C++のヘッダファイルのインクルードが2回目以降の展開を防ぐためのスキップするためにプロプロセッサに指示するテクニックです。#pragma onceの意味は、インクルードを一度だけ行う、という意味です。
  
 
'''読み方'''
 
'''読み方'''
行16: 行16:
 
#pragma once
 
#pragma once
 
</syntaxhighlight>
 
</syntaxhighlight>
 +
pragma([[プラグマ]])を使用した[[インクルードガード]]は、マイクロソフトの Visual Studio のコンパイラだけではありません。
 +
注意事項として、以下のことがあげられます。
 +
* C/C++の標準仕様ではありません。
 +
* シンボリックリンクを正しくハンドリングできないコンパイラがあります。
 +
 
== 従来型のインクルードガード ==
 
== 従来型のインクルードガード ==
 
<syntaxhighlight lang="cpp">
 
<syntaxhighlight lang="cpp">

2014年5月24日 (土) 13:25時点における最新版

インクルードガード (include guard)とは、C/C++のヘッダファイルのインクルードが2回目以降の展開を防ぐためのスキップするためにプロプロセッサに指示するテクニックです。#pragma onceの意味は、インクルードを一度だけ行う、という意味です。

読み方

インクルードガード
いんんくるーどがーど
include guard
いんんくるーどがーど

概要

プロプロセッサは、プロプロセッサディレクティブ include に遭遇するたびに、ヘッダファイルを展開しようとします。ヘッダAがヘッダBを、ヘッダBがヘッダAを互いにインクルードしているとしたら、どちらか一方をインクルードすると定義が二重に定義されます。インクルードガードは、そういった事態を防ぐものです。

ifndef/define を使用してインクルードガードを書くのが一般的でした。 C++では、プラグマ #pragma onceを使用して、インクルードガードを実現します。

インクルードガード

#pragma once

pragma(プラグマ)を使用したインクルードガードは、マイクロソフトの Visual Studio のコンパイラだけではありません。 注意事項として、以下のことがあげられます。

  • C/C++の標準仕様ではありません。
  • シンボリックリンクを正しくハンドリングできないコンパイラがあります。

従来型のインクルードガード

#ifndef HOGE_H
#define HOGE_H
class Hoge {
};
#endif // HOGE_H

関連項目