2

私は何ヶ月も自分でこれを理解しようとしてきましたが、それは誇張ではありません.

物事が複雑になると物事が壊れて範囲外になる傾向があり、これに対する答えがどこにも見つからないため、私がしていない方法を使用すると汚いと感じます。

次のようなプロジェクト構造があります。

Project-Directory/
main.cpp
makefile
SDLMain.h // SDL libraries required to be in the project directory.
SDLMain.m // SDL libraries required to be in the project directory.

--- gamestate/
------ clean.cpp
------ gamestate.cpp
------ gamestate.h
------ init.cpp

--- graphics/
------ graphics.h
------ // more .cpp files

--- logic/
------- logic.h
------- // more .cpp files

--- character
------- character.h
------- // more .cpp files

main.cpp私は持っています:

// C++ Libraries
#include <iostream>

// Graphical Libraries
//#include <SDL/SDL.h>
//#include <SDL/SDL_opengl.h>

// Custom Libraries
#include "character/character.h"
#include "logic/logic.h"
#include "graphics/graphics.h"
#include "gamestate/gamestate.h"

文字やグラフィックなどのすべての .cpp ファイルには、フォルダーと同じ名前を共有するそれぞれのヘッダー ファイルが含まれています。つまりclean.cppgamestate.cppおよびinit.cppすべてが含まれますgamestate.h

各フォルダーには、最近 .cpp ごとに 1 つのヘッダー ファイルから再編成された 1 つのヘッダー ファイルしかありません。

基本的に、この新しい、より構造化されたシステムでは、プロジェクトをコンパイルしようとするとスコープ エラーが発生します。

私のヘッダファイルが後にインクルードされ#include <iostream>、SDLライブラリがmain.cpp.

これをすべてのヘッダーファイルに挿入してエラーを解決しました:

// C++ Libraries
#include <iostream>

// Graphical Libraries
#include <SDL/SDL.h>
#include <SDL/SDL_opengl.h>

しかし、私は同じことを何度も何度も含めています。これは確かに悪い習慣です。

これだけでなく、関数 ingamestate.hによって使用されるプロトタイプが含まれており、 in がbefore に含まれていても暗黙的にinを含めない限り、スコープ エラーが発生します。gamestate.cpplogic.cpplogic.hgamestate.hlogic.hmain.cppgamestate.h

#includeは、ヘッダー ファイルの内容をスコープとそれがプロトタイプ化する関数にドラッグして、コンパイラが何を期待するかを知ることを意図していると考えました。

スコープと関数が存在しないというエラーが表示されるのはなぜですか?

global.hそこに#includeすべてのSDLなどを作成する必要<iostream>がありますか?

でプロトタイプ化された関数に、logic.h後で に含まれる別のファイルからアクセスできないのはなぜmain.cppですか?

4

1 に答える 1

2

これは、「さまざまな方法で実行できますが、どれも完全に正しいか間違っているかということではありません」という質問のようなものです。

ただし、技術的には、ソース ファイルには、依存するすべてのヘッダーを含める必要があります。したがって、「gamestate.cpp」が「logic.cpp」に何かを必要とする場合、「gamestate.cpp」には「logic.h」を含める必要があります。「gamestate.h」を使用するすべての場所で「logic.h」も必要な場合、「gamestate.h」にはおそらく「logic.h」を含める必要がありますが、私はルールが次のようなシステムで作業しました: gamestate.h" の場合、最初に "logic.h" を含める必要があります。「gamestate.cpp」は「main.cpp」内でコンパイルされないことに注意してください (「main.cpp」内に「gamestate.cpp」を含めるという凶悪な犯罪を犯した場合を除きますが、そうしないでください)。

ヘッダー ファイルの前に追加する必要があるヘッダー ファイルのリストを覚えておく必要がなく、ヘッダー ファイルを直接使用できるところが気に入っています。

「global.h」を使用するのはおそらく悪い考えです。

于 2013-06-01T09:05:56.917 に答える