2010-12-26 2 views
4

私は自分自身を「加速されたC++」から散発的に教えてきましたが、最近私は#include <algorithm>の文を忘れてしまったので、私のコード(transformとfind_ifを含む)はコンパイルと実行に成功しました。この後、私はすべての標準的なヘッダーのインクルードステートメントを削除しようとし、私のコードがまだ実行されていることがわかりました。'#include'ステートメントを挿入せずにcpp標準ライブラリにアクセスする方法はありますか?

私は本書を完成させるまでにプリプロセッサコマンドが解決されるとは思っていませんが、ヘッダーを不適切に作ったときに私の端末が私に叫ぶようにする方法を知る必要があります。物事がstdライブラリにどこにあるのかを学ぶ。

私はそう、私は次のUNIXのexeファイルを使用して自分のコードをコンパイルする必要がOS 10.6.5を実行しています:

CC = g++ 
CFLAGS = -Wall 
PROG = TrainingProject23 

SRCS = TrainingProject23.cpp 

ifeq ($(shell uname),Darwin) 
    LIBS = -framework OpenGL -framework GLUT 
else 
    LIBS = -lglut 
endif 

all: $(PROG) 

$(PROG): $(SRCS) 
    $(CC) $(CFLAGS) -o $(PROG) $(SRCS) $(LIBS) 

clean: 
    rm -f $(PROG) 

私はそれにも学んでいますし、十分にそれが簡単にするので、それは、OpenGLのビルドプロトコルを含んでいますこのファイルを使用してすべてのC++プロジェクトをコンパイルします。私はsrcファイルとプログラム名を変更する方法以外にも、Makefileを実際に理解していません。私はちょうどそれをインターネットから手に入れました。

+2

情報が不十分です。私はTrainingProject23.cppが必要です。 –

+0

うーん... TrainingProject23は私が上記のUnixファイルを非常に変更する必要がないように私が開いたままのファイルです(私はSRCS = TrainingProjects23をプロジェクトからプロジェクトに同じままにしておきます)。私は頻繁に内容を完全に削除し、新しいものを試し始める。私はもうコンテンツを持っていませんが、私が試したすべてのコードは同じ結果をもたらします:必要な標準ライブラリノードが含まれているかどうかにかかわらず、実行とコンパイルは成功します。 – hedgehogrider

答えて

5

標準ライブラリヘッダは、他の標準ライブラリのヘッダーを含めるように許可されているだけでずさんです。たとえば、 #include <string>;実装には、他のすべての標準ライブラリヘッダー(たとえば、<algorithm>など)を含めることができます(必須ではありません)。あなたのケースでは、おそらくそれが起こったが、それはあなたが頼りにするべきではありません。

+2

C++では、それは一般的に真です(どんなC++標準ヘッダーでも他のものにドラッグできます)。純粋な標準Cでは、そうではありません。 1つの特定の特殊なケースを除いて、1つの標準ヘッダーは他のものを引き出すことができません: ''は ''を含むことができます。 POSIXでは、いくつかのヘッダにいくつかのヘッダを含めることができます。 –

+0

@Jonathan - 良い点。しかし、彼は非標準ヘッダーも持っていた可能性があります。 – DVK

+0

AHA!私はこれを知らなかった!これは間違いなく問題でした。実際には、あなたが提供したの例が、私が気づいた正確なシナリオであることを確信しています。コメントしたすべての人に感謝します! – hedgehogrider

5

あなたの正確なコードを見ることなく確かに知るのは難しいですが、あなたのコードではなかった他のヘッダファイル(コメントのKristopherはOpenGLやGLUTを推測しています)明示的に含める。

など。

# File: my_incl.h 
#include <algorithm> 

# File: main.c 
#include "my_incl.h" 
# yay - you just included the algorithm.h without even trying. 

これが動作することに注意し、それに頼ることは悪い習慣で、さまざまな理由でください:

  • プロジェクトが「my_incl.h」を含む停止した場合、それは突然のコンパイルを停止します100%すぐに明らかな原因はありません。

  • includeのリストはコードによってどのライブラリが使用されているかを簡単にまとめられるため、コードを読みやすく/理解しやすくします。

  • それは

+0

これは、ゴルフでよく使われます。私たちが関心のあるものを含む短い名前のヘッダーを含めてください。 – marcog

+1

これを拡張するには:OpenGLやGLUTヘッダーファイルが含まれている可能性があります。おそらく標準的なライブラリヘッダを含んでいます。 –

+0

@marcog - Cでゴルフの私の日(Perlとは対照的に)waaaaaay過去ですが、知っておくべき良いヒントです、ありがとう! – DVK

関連する問題