ヘッダーファイルについて

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
yasya

ヘッダーファイルについて

#1

投稿記事 by yasya » 16年前

クラスを入れたヘッダーファイルを他のヘッダーファイルで読み込んで、さらにそれを複数のソースファイルで使いたいと思ってるんですけど、どうすればいいかわかりません。そもそも、これは可能なのでしょうか?
教えてください。
あと、ファイルを添付しておきます。(今の状態ではエラーが出ますけど^^;)

box

Re:ヘッダーファイルについて

#2

投稿記事 by box » 16年前

「多重インクルード」や「インクルードガード」という
キーワードについて調べてみると、何かよいことがあるかもしれません。

yasya

Re:ヘッダーファイルについて

#3

投稿記事 by yasya » 16年前

boxさんが言うように、インクルードガードについて調べて、それを使ってコンパイルしてみました。
しかし、やっぱりエラーが出てしまいます・・・。どうしてでしょうか?

/* CString.h */
#ifndef CSTRING_H
#define CSTRING_H

中略

#endif

今上に書いたような感じになってるんですけど、これが間違ってるんでしょうか?

御津凪

Re:ヘッダーファイルについて

#4

投稿記事 by 御津凪 » 16年前

添付されているファイルにはインクルードガードとほぼ同様の #pragma once が入っているので、
結果はかわらないと思います。

ヘッダファイルにはクラスメンバ関数の定義があるので、その部分だけを別のソースファイル(*.cpp)に移してやってみたらどうでしょうか。(CString.hへのインクルードは必要)

yasya

Re:ヘッダーファイルについて

#5

投稿記事 by yasya » 16年前

御津凪さんの言うようやってみましたが、ダメでした・・・。
他にいい方法はないでしょうか?

YuO

Re:ヘッダーファイルについて

#6

投稿記事 by YuO » 16年前

> 今の状態ではエラーが出ますけど

「エラーが出る」ではなく,「こういうエラーが出る」と,具体的なエラーの中身を提示してみてください。
エラーメッセージをCopy & Pasteするのが一番良い方法ですが,ファイル名などは隠しても問題ないと思います。

yasya

Re:ヘッダーファイルについて

#7

投稿記事 by yasya » 16年前

とりあえず、上で添付したファイルをコンパイルすると、

mein.obj : error LNK2005: "public: __thiscall CString::CString(void)" (??0CString@@QAE@XZ) は既に a.obj で定義されています。
mein.obj : error LNK2005: "public: __thiscall CString::CString(int)" (??0CString@@QAE@H@Z) は既に a.obj で定義されています。
mein.obj : error LNK2005: "public: __thiscall CString::~CString(void)" (??1CString@@QAE@XZ) は既に a.obj で定義されています。
mein.obj : error LNK2005: "public: class CString & __thiscall CString::CopyString(char *,int)" (?CopyString@CString@@QAEAAV1@PADH@Z) は既に a.obj で定義されています。
mein.obj : error LNK2005: "public: class CString & __thiscall CString::CatString(char *)" (?CatString@CString@@QAEAAV1@PAD@Z) は既に a.obj で定義されています。
mein.obj : error LNK2005: "public: class CString & __cdecl CString::Format(char *,...)" (?Format@CString@@QAAAAV1@PADZZ) は既に a.obj で定義されています。
mein.obj : error LNK2005: "public: class CString & __thiscall CString::LeftTrim(void)" (?LeftTrim@CString@@QAEAAV1@XZ) は既に a.obj で定義されています。
mein.obj : error LNK2005: "public: class CString & __thiscall CString::RightTrim(void)" (?RightTrim@CString@@QAEAAV1@XZ) は既に a.obj で定義されています。
mein.obj : error LNK2005: "public: class CString & __thiscall CString::Trim(void)" (?Trim@CString@@QAEAAV1@XZ) は既に a.obj で定義されています。
mein.obj : error LNK2005: "public: class CString & __thiscall CString::Left(int)" (?Left@CString@@QAEAAV1@H@Z) は既に a.obj で定義されています。
mein.obj : error LNK2005: "public: class CString & __thiscall CString::Right(int)" (?Right@CString@@QAEAAV1@H@Z) は既に a.obj で定義されています。
mein.obj : error LNK2005: "public: class CString & __thiscall CString::Mid(int,int)" (?Mid@CString@@QAEAAV1@HH@Z) は既に a.obj で定義されています。
mein.obj : error LNK2005: "public: class CString & __thiscall CString::Delete(int,int)" (?Delete@CString@@QAEAAV1@HH@Z) は既に a.obj で定義されています。
mein.obj : error LNK2005: "public: int __thiscall CString::Find(char)" (?Find@CString@@QAEHD@Z) は既に a.obj で定義されています。
mein.obj : error LNK2005: "public: int __thiscall CString::Find(char *)" (?Find@CString@@QAEHPAD@Z) は既に a.obj で定義されています。
mein.obj : error LNK2005: "public: int __thiscall CString::ReverseFind(char)" (?ReverseFind@CString@@QAEHD@Z) は既に a.obj で定義されています。
mein.obj : error LNK2005: "public: int __thiscall CString::ReverseFind(char *)" (?ReverseFind@CString@@QAEHPAD@Z) は既に a.obj で定義されています。
LINK : fatal error LNK1104: ファイル 'DxLib.lib' を開くことができません。

と、18個のエラーが出ます。

Mist

Re:ヘッダーファイルについて

#8

投稿記事 by Mist » 16年前

CSting.hの355行目以降のクラス関数の定義をa.cppに移動したらビルドできましたよ。

YuO

Re:ヘッダーファイルについて

#9

投稿記事 by YuO » 16年前

リンクエラーですね。

今回の場合は,最後の物 (DxLib.libを開けない) を除くと,単一定義規則違反のようです。
インクルードガードは,「ひとつの」翻訳単位に対してのみガードする物です。
それに対して,このエラーは,「複数の」翻訳単位に同一名の関数があるために起きています。

・インライン関数 (クラス内定義,テンプレートなどの暗黙による物を含む) を除くすべての関数は,インクルードされるファイルに書かない
・変数の定義は,インクルードされるファイルに書かない
これを守る必要があります。

yasya

Re:ヘッダーファイルについて

#10

投稿記事 by yasya » 16年前

ありがとうございます。
指示してくれた通りやればエラーが消えました。
質問に答えてくれた皆さん、本当にありがとうございました^^

閉鎖

“C言語何でも質問掲示板” へ戻る