2010-12-26 2 views
4

Ich habe mich cpp sporadisch von 'beschleunigtes C++' gelehrt und vor kurzem habe ich festgestellt, dass, wenn ich meine #include <algorithm>-Anweisung vergessen habe, mein Code (der transform und find_if enthält) kompiliert und trotzdem erfolgreich ausgeführt wurde. Danach habe ich versucht, alle Standard Header Include-Anweisungen vollständig zu entfernen und festgestellt, dass mein Code noch ausgeführt wurde.Wie greife ich auf die cpp-Standardbibliothek zu, ohne "#include" -Anweisungen zu setzen?

Ich nehme an, dass meine Unfähigkeit, Präprozessorbefehle zu verstehen, bis zum Ende des Buches gelöst sein wird, aber jetzt muss ich nur wissen, wie ich sicherstellen kann, dass mein Terminal mich schreit, wenn ich den Header falsch mache lerne, wo sich die Dinge in der std-Bibliothek befinden.

mir läuft OS 10.6.5, also muss ich meinen Code mit der folgenden Unix-EXE-Datei kompilieren:

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) 

es das Build-Protokoll für OpenGL enthält, weil ich das so gut lerne und es einfach genug um diese Datei zu verwenden, um alle meine C++ - Projekte zu kompilieren. Ich verstehe das Makefile nicht wirklich, außer wie ich den Quellcode und den Programmnamen ändere, ich habe es gerade aus dem Internet geholt.

+2

Nicht genügend Informationen. Wir brauchen TrainingProject23.cpp –

+0

Hmm ... TrainingProject23 ist nur eine Datei, die ich geöffnet habe, so dass ich die obige Unix-Datei nicht sehr ändern muss (ich bekomme SRCS = TrainingProjects23 das gleiche von Projekt zu Projekt). Ich lösche die Inhalte häufig vollständig und beginne von vorne, um etwas Neues auszuprobieren. Ich habe den Inhalt nicht mehr, aber jeder Code, den ich ausprobiert habe, führt zu denselben Ergebnissen: Er läuft und kompiliert erfolgreich, unabhängig davon, ob die erforderlichen Standardbibliotheksknoten enthalten sind oder nicht. – hedgehogrider

Antwort

5

Standardbibliothek Header erlaubt sind andere Standard-Bibliothek-Header enthalten. Wenn Sie z.B. #include <string>; Ihre Implementierung ist erlaubt (aber nicht erforderlich), jeden anderen Standard-Bibliothekskopf zu enthalten, einschließlich <algorithm>. In Ihrem Fall ist das wahrscheinlich passiert, aber darauf sollten Sie sich nicht verlassen.

+2

In C++ ist das im Allgemeinen richtig (wie in jedem C++ - Standard-Header kann in andere gezogen werden).In reinem Standard C ist das nicht der Fall; Ein Standard-Header ist nicht erlaubt, andere einzubinden - außer für einen speziellen Spezialfall: '' kann '' enthalten. In POSIX dürfen einige Header einige andere enthalten. –

+0

@ Jonathan - guter Punkt. Er hätte auch nicht standardmäßige Header haben können. – DVK

+0

AHA! Das wusste ich nicht! Das war definitiv das Problem. In der Tat bin ich ziemlich sicher, dass das Beispiel, das Sie zur Verfügung stellten, das genaue Szenario war, in dem ich es bemerkte. Danke an alle die kommentiert haben! – hedgehogrider

5

Es ist schwer, sicher zu wissen, ohne Ihren genauen Code zu sehen, aber eine mögliche Option ist, dass Sie andere Header-Dateien (Kristopher in Kommentaren raten OpenGL und/oder GLUT), die wiederum die Bibliotheken enthalten Ihren Code didn ' t explizit einschließen.

z.

# File: my_incl.h 
#include <algorithm> 

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

Bitte beachten Sie, dass dies funktioniert, aber auf sie angewiesen ist schlechte Praxis, für eine Vielzahl von Gründen:

  • Wenn Ihr Projekt nicht mehr mit „my_incl.h“, wird es plötzlich nicht mehr kompilieren , ohne 100% sofort offensichtliche Ursache.

  • Es macht den Code schwieriger zu lesen/zu verstehen, da eine Liste von Includes Ihnen eine schnelle Übersicht darüber gibt, welche Bibliotheken von Ihrem Code verwendet werden.

  • Es ist gerade Sloppy

+0

Nebenbei wird dies häufig beim Golfspielen verwendet: Fügen Sie einen Header mit einem kurzen Namen ein, der diejenigen enthält, an denen wir interessiert sind. – marcog

+1

Um dies zu erweitern: Sie sind wahrscheinlich OpenGL und/oder GLUT-Header-Dateien, und sie sind wahrscheinlich einschließlich Standard-Bibliotheks-Header. –

+0

@marcog - meine Tage Golf in C (im Gegensatz zu Perl) sind waaaaaay vorbei aber guter Tipp zu wissen, danke! – DVK

Verwandte Themen