2009-09-03 24 views
2

Asタイトルには次のように書かれています。私は、ヘッダファイルを複数回インクルードすることによる再定義エラーに遭遇しています。私はそのことを知っていますが、解決する方法はわかりません。はい、以前は1時間前に同じ問題を投稿しました。しかし、私は正しく説明することができず(私はそう思う)、期待通りの答えを得られなかった。ここにリンクがある:それは:)をいっぱいにしているのでヘッダーファイルを複数回含むことによるC++の再定義

C++ Redefinition Header Files

私はその質問を編集していませんよ。

オーケー、私はいくつかのクラスがあり、それらの構造は、このようなものです:

main.cppに:

#include "Server.h" 
#include "Handler.h" 
#include "Processor.h" 

int main(int argc, char* argv[]) 
{ 

} 

Server.h:

// Server.h 
#pragma once 

#include <winsock2.h> 

ハンドラ.h:

// Handler.h 
#pragma once 

#include <string> 
#include <vector> 

#include "Server.h" 

Processor.cpp:

// Processor.cpp 

#include "StdAfx.h" 
#include "Processor.h" 
#include "Handler.h" 

Server.cpp:

// Server.cpp 

#include "Server.h" 
#include "Processor.h" 

問題は、それがどこにある<winsock2.h>は知りませんが、複数回含まれていることです。 の#pragmaはかつて私のコンパイラ(この場合はMSVC2008)で

#ifndef SOME_FILE_H 
#define SOME_FILE_H 
// code here 
#endif // SOME_FILE_H 

と同じ目的を果たします。だから、私はガードを含むヘッダーは必要ないと確信している。しかし、私はどこで<winsock2.>が2回含まれている間違いをしているのか分かりますか?どのように解決できますか?

ありがとうございます。

+0

Processor.hはどこですか? – Klaim

+0

StdAfx.hには何がありますか? –

+0

同じ質問を2回尋ねると、重複が作成されます。投票を終了する。 –

答えて

1

stdafxまたはwindowsを含める前に、これらの一部またはすべてが必要です。

#define _MSWSOCK_ 
#define NCB_INCLUDED 
#define _WINSOCK2API_ 
#define _WINSOCKAPI_ /* Prevent inclusion of winsock.h in windows.h */ 
+0

理由を説明できますか? – akif

+0

@Manzoor:MSヘッダーの配置方法です。あなたはルールに従わなければならないが、ルールが文書化されている場所はわからない。 MSツールチェーンを使って作業しているとき、私はいつもウィザードで最初の空のプロジェクトを生成させるのが有益だとわかっています。それはすべてが正しく設定されていることを保証し、この種のことに時間を費やさないようにします。 –

+0

なぜ私は考えていない。 MFCを使用する外部ヘッダーを含める必要があったので、私のプロジェクトでこの問題が発生しました。これを回避する可能性は高いですが、このソリューションは迅速であり、副作用なしで機能します。 –

0

他の回答でお試しいただいたことはありますか?

真剣に、#pragma onceの代わりにインクルードガードを使用してみてください。

まだの場合、問題が発生した場合は、もう一度返って、別の質問を投稿してください。私たちのアドバイスを受け入れることを嫌う(またはできない)ので、同じことについて複数の質問を投稿しないでください!

+2

MSの特異性を除いて、#pragmaに何が間違っていますか? –

+0

他の質問で自分の回答を読んでいませんか? – akif

+0

真剣に、あなたの提案は「私はMSVCかGCCのどちらも使用しないので、それらのコンパイラの非標準機能を使用すべきではありません」と述べています。誰かがスレッドに問題がある場合、「最初にプログラムをシングルスレッドにしてください。そうでなければ、誰かがあなたを助けることを期待できません」とは言いません。 –

5

プロジェクト設定: プロジェクトプロパティ - >設定 - >詳細 - >表示が含まれます。

これはヘッダのインクルードツリーをダンプします。そこから、あなたは原因を見ることができます。

+0

便利なヒントがあります! – xtofl

0

試し

#ifndef _WINSOCK2API_ 
#include <winsock2.h> 
#endif 

_WINSOCK2API_がwinsock2.h内で定義されているので、コンパイラはそれを複数回含めるようにしようとはしませんと

#include <winsock2.h> 

を交換します。

+1

試してみましたが、運がない:( – akif

1

windows.hを含む前に私は最近同じ問題を抱えてそれを解決しました。winsock2.hを含めて解決しました。

0

私はこの問題を覚えているようです。 windows.hとwinsock2.hの間に依存関係の問題があると思います。 私はいつでもwindows.hを使用してその周りに覚えているようです。

関連する問題