ページ 11

多重インクルードにういて

Posted: 2009年12月11日(金) 00:03
by uul
多重インクルード禁止について
今まで、メインソース(cpp)一つとヘッダーでやってきましたが
最近プログラムが長すぎるようになり多重インクルードよく発生します。
毎回インクルードファイルを書くのもめんどくさいし、どうやったら多重インクルードをおこらないように
綺麗まとめられます?
あと、関数も私はヘッダーに書いてましたけど、
人のプログラムを見るとヘッダーに関数の名前、cppファイルにその関数の内容を書いてます。
普通はそうなんですか?

Re:多重インクルードにういて

Posted: 2009年12月11日(金) 00:58
by array
多重インクルードという用語を知っているので既知の事かもしれませんが

C++ だと、ヘッダファイルの先頭の行に
#pragma once
を追記するだけで多重インクルードガードしてくれます。

ヘッダファイルには宣言のみで実態を記述してはいけません。
記述されてると、コンパイルエラーになるはずなのでお気をつけて。

C言語でも可能です
/* main.h */
#ifndef MAIN_H      // インクルードガード
#define MAIN_H

struct sample
{
	int num;
};

#endif             // ここまで
MAIN_Hというのは、ヘッダファイル名を大文字にして.を_になってます。
これが一般的らしいです。少し特殊な文字列に見えるかもしれませんが
他のdefine定数と被らないよう配慮しての事だと思います。
他にも __MAIN_H__ などが一般的によく用いられています。

参考:http://www.geocities.jp/ky_webid/c/060.html



> あと、関数も私はヘッダーに書いてましたけど、
> 人のプログラムを見るとヘッダーに関数の名前、cppファイルにその関数の内容を書いてます。
> 普通はそうなんですか?

普通は、cppファイルに関数を書きます。
極論、ヘッダファイルはプロトタイプ宣言のみを行います。

Re:多重インクルードにういて

Posted: 2009年12月11日(金) 01:37
by kazuoni
> C++
> #pragma once

Visual C++のことですかね?
たしか、gccでも使えたような気がしますが・・・(嘘でしたら申し訳ありません。。)

Re:多重インクルードにういて

Posted: 2009年12月11日(金) 05:09
by Ma
>gccでも使えたような
使えなかったと思います。

代用として、

#ifdef tempNAME
#define tempNAME

<ここに中身。>

#endif

が使えたはずです。

Re:多重インクルードにういて

Posted: 2009年12月11日(金) 08:59
by たいちう
× #ifdef tempNAME
○ #ifndef tempNAME