VC6.0SP5 XpPro
こんにちは、
すごく単純なミスかもしれませんが、まったく理解できませんでしたので、
どなたかよろしくお願いいたします。
---main.cppーーー
#include Diam.cpp
int main(){
return 0;
}
先ほど間違って送信してしました.
//---main.cpp---
#include Diam.cpp
int main(){
return 0;
}
//---Diam.cpp---
#ifndef DIAM
#define DIAM
#include Diam.h
#endif
void Diam::READ(unsigned char IMAGE[256][256], char *FILENAME)
{
return;
}
//---Diam.h---
class Diam{
public:
void READ(unsigned char IMAGE[256][256], char *FILENAME);
};
この3つのプログラム(なんの意味もないですが。。。)を実行すると
track.obj : error LNK2005: public: void __thiscall Diam::READ(unsigned char (*
const)[256],char *) (?READ@Diam@@QAEXQAY0BAA@EPAD@Z) はすでに Diam.obj で定義さ
れています
Debug/main.exe : fatal error LNK1169: 1 つ以上の複数回定義されているシンボルが見つ
かりました
と成ります。どのタイミングで定義されているかがよくわからず苦しんでいます。
よろしくお願いいたします。
LNK2005 : シンボルの多重定義。複数の実装があって、どれをリンクしていいのか決められな
い。
LNK1169 : 同上。
Diam.cpp の中に main が定義されていませんか?
# リンカが吐いたメッセージを示してください。
Diam.cpp と main.cpp をコンパイル/リンクしたのなら、そのエラーが出て'アタリマエ'で
す。
>//---main.cpp---
>#include Diam.cpp
>int main(){
> return 0;
>}
#include Diam.cpp があるので、ソースファイル main.cpp にはクラス Diam の
メンバー函数(かんすう)Read() の定義が存在することになるので、main.cpp と
Diam.cpp とに同じもの (Diam::Read()) があることになります
ですから、επιστημη さんの
>Diam.cpp と main.cpp をコンパイル/リンクしたのなら、そのエラーが出て'アタリマエ'で
>す。
ということになるのです
ところで、以下の部分は何のおまじないでしょうか?
>//---Diam.cpp---
>#ifndef DIAM
> #define DIAM
> #include Diam.h
>#endif
ところで、以下の部分は何のおまじないでしょうか?
>//---Diam.cpp---
>#ifndef DIAM
> #define DIAM
> #include Diam.h
>#endif
.cpp に書いても何の効き目もありませんですねぇ ^^;
# .cpp を #include すること自体、相当にイレギュラーだし
> .cpp を #include すること自体、相当にイレギュラーだし
御意。
たまに見ますね、cppファイルをインクルードしているソース。
インクルードするならcppにしなきゃ良いのにと思いますけれど、
通常はcppはインプリメントするためのファイルなのでインクルードするのは
おかしいと思います。
プリコンパイラにしてみれば、単に指定されたファイルを展開するだけなので
エラーにはなりませんからねぇ。
エラーにならないから何をしても良いというのはちょっと違うと思います。
結局こうしたいのでは?
// main.h
#ifndef DIAM
#define DIAM
#include Diam.h
#endif
// main.cpp
#include main.h
int main()
{
return 0;
}
// Diam.h
class Diam{
public:
void READ(unsigned char IMAGE[256][256], char *FILENAME);
};
// Diam.cpp
void Diam::READ(unsigned char IMAGE[256][256], char *FILENAME)
{
return;
}
VCなら多重インクルード防止に#pragma onceが使えますね。
あ、修正。
// Diam.cpp
#include Diam.h // <-これ必要
void Diam::READ(unsigned char IMAGE[256][256], char *FILENAME)
{
return;
}
…僕は単純に
#include Diam.h を間違えて
#include Diam.cpp にしちゃっただけのことやと思うですが。