2010-04-04 9 views
6

Mam text.cpp, który zawiera header.h i header.cpp, który zawiera header.h.C++ to .h zawiera .cpp z taką samą nazwą jak również?

Czy plik header.cpp zostanie również skompilowany? Śledzę tu przewodnika i jestem całkowicie zdezorientowany.

Co to jest poprawna terminologia, o którą pytam? Wiem, że brzmi jak kretyn i przepraszam, ale jestem ignorantem.

Och, int main() jest w test.cpp.

Ponadto, jeśli header.cpp zawiera <iostream>, dlaczego nie mogę używać wywołań funkcji iostream w text.cpp, jeśli jest uwzględniony? Jeśli dodaję <iostream> do text.cpp, to zostanie on włączony do programu dwukrotnie (innymi słowy, nadąć go)?

+5

Nie brzmisz jak kretyn. Głupek nie prosi o pomoc. – GManNickG

Odpowiedz

4

Powiesz kompilatorowi, które pliki C++ chcesz skompilować. #include nie ma z tym nic wspólnego.

Na przykład, jeśli używasz g ++:

g++ text.cpp // Doesn't compile header.cpp 
g++ text.cpp header.cpp // Compiles both 

(or, alternatively you can compile one file at a time and then link them) 
g++ text.cpp -o text.o 
g++ header.cpp -o header.o 
g++ text.o header.o -o your-program 

W przypadku korzystania z programu Visual Studio i stworzyli projekt, wszystkie pliki C++ utworzone zostaną automatycznie skompilowany.

Jeśli używasz nie, powiedz mi nazwę kompilatora i mogę powiedzieć dokładnej składni :)


Teraz na inne pytanie:

Ponadto, jeśli header.cpp zawiera iostream, dlaczego nie mogę używać wywołań funkcji iostream w text.cpp, jeśli jest to zawarte? Jeśli dołączę iostream w wersji text.cpp, zostanie on dwukrotnie uwzględniony w programie (innymi słowy, będzie to oznaczać, że jest on zbyt duży)?

#include mówi kompilator, aby po prostu "skopiować całą zawartość pliku, który jesteś w komplecie, i wklej je tam, gdzie jest linia #include". Tak więc teoretycznie można po prostu otworzyć iostream za pomocą notatnika, zaznaczyć wszystkie, ctrl-c i ctrl-v w pliku .cpp, a efekt końcowy będzie dokładnie taki sam =)

Tak, tak musi być dołączony do każdego pliku .cpp, w którym chcesz go użyć, i nie będzie "nadużywał" twojego programu: zawiera tylko definicje klas, funkcje zewnętrzne, itp.

Och, i to jest oczywiste, ale C++ jest bardzo rozległym i trudnym językiem programowania, będziesz miał dużo lepszego szczęścia, ucząc się go poprzez książkę niż przewodnik. Jeśli nie chcesz wydawać pieniędzy, książka w porządku C++ (do pobrania) to Thinking in C++, Bruce Eckel. W przeciwnym razie, jeśli chcesz go kupić, możesz znaleźć dobrą listę here.

+0

Dziękuję bardzo. Będę pamiętać o twoich radach. – aaron

+1

Istnieje książka w formacie C++ na stronie: http://stackoverflow.com/questions/388242/the-definitive-c-book-guide-and-list –

1

jest kompilowany tylko w przypadku kompilacji. Nie jest automagicznie zasysane podczas kompilowania test.cpp.Aby wyprodukować program działa, trzeba także powiązanie wynikające .o plików w jednym pliku binarnego, w następujący sposób (uproszczony):

c++ -c test.cpp 
c++ -c header.cpp 
c++ -o test test.o header.o 
0

kompilować każdy plik źródłowy osobno lub razem, a następnie połączyć wynikających moduły obiektów.

E.g. Visual C++ (Razem)

lub osobno,

cl /c text.cpp 
cl /c header.cpp 
link text.obj header.obj /out:foo.exe 

Aby uzyskać obraz wynikowy EXE, foo.exe.

Ponadto, jeśli header.cpp obejmuje , dlaczego nie mogę używać IOStream wywołania funkcji w text.cpp jeśli jest włączone? Jeśli dołączę iostream w wersji text.cpp, zostanie on dwukrotnie uwzględniony w programie (innymi słowy, będzie to oznaczać, że jest on zbyt duży)?

Ponieważ nagłówki zawierają tylko deklaracje, nie ma nic złego w ich włączaniu wiele razy. Nie będą niczego powiększać, ponieważ kompilator wyrzuca je po sprawdzeniu typu.

Ale jeśli masz w nich definicje typów, potrzebujesz #include guards, aby typy nie były przedefiniowane.

Powiązane problemy