おとついの晩ご飯

忘れやすいので忘れたくないことを書いています。

【C++】#Includeについて 1つ以上の複数回定義されているシンボルがみつかりました。

問題

いろんなクラスの関数・変数を呼ぶために#Includeを記載するが、どうやら何度も定義されている関数があるみたい。 Includeループ地獄に入ってしまった。


そもそもIncludeとは

他のクラスで宣言されている関数・変数などを今実装中の箇所でも使用するために、その関数宣言を実装箇所で認識させるためのものと思っている。
なんでもincludeすると、指定したファイルがそのまま展開されるとのことで、includeしたファイルの中でさらにincludeしているなんてことはざらにあると思われる。


解決策

pragma once

ほとんどの場合最初からこれが定義されていると思うので、これで直ることはあまりないと思うが、これを書くだけで同じヘッダーファイルは一度しか展開されなくなり、重複定義が解決できるかも。
ちなみにインクルードガードというものもあるようです。(以下のような)

#ifndef HOGE
#define HOGE
#endif

pragma onceを使っていれば不要な気がします。意味あるのか?


externを使う

そもそもincludeが必要かを考える。
externを関数や変数の頭につけると、他のファイルで宣言されている関数や変数を使うことができる。

global.h

int globalInt;

local.h

int localInt;
extern int globalInt;

上記のようにExternを使えばIncludeせずとも関数や変数が使えるようになる。