2010-04-04 3 views
6

У меня есть text.cpp, который включает header.h и header.cpp, который включает header.h.C++ include .h включает .cpp с тем же именем?

Будет ли скомпилирован заголовок.cpp? Я следую за проводником здесь, и я полностью смущен.

Кроме того, что является правильной терминологией для того, что я прошу? Я знаю, что я похож на придурка, и я извиняюсь, но я не знаю.

О, int main() находится в test.cpp.

Кроме того, если header.cpp содержит <iostream>, почему я не могу использовать вызовы функций iostream в text.cpp, если он включен? Если я включу <iostream> в text.cpp, он будет включен в программу дважды (другими словами, надуть ее)?

+5

Вы не похожи на придурка. Придурок не просит помощи. – GManNickG

ответ

4

Вы сообщаете своему компилятору, какие файлы на C++ компилируются. #include не имеет к этому никакого отношения.

Например, если вы используете г ++:

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 

Если вы используете Visual Studio, и вы создали проект, все файлы C++, которые вы создаете, будут автоматически компилируется.

Если вы не используете ни, скажи мне имя вашего компилятора, и я могу сказать вам точный синтаксис :)


Теперь, для другого вопроса:

Кроме того, если header.cpp включает iostream, почему я не могу использовать iostream вызовы функций в text.cpp, если он включен ? Если включить iostream в text.cpp, он будет включен в программу дважды (другими словами, раздувание )?

сообщает компилятору, что он просто «скопирует все содержимое файла, в который вы включаете, и вставьте их там, где строка #include». Итак, теоретически вы можете просто открыть iostream с помощью блокнота, выбрать все, ctrl-c и ctrl-v в вашем .cpp-файле, а конечный эффект будет точно таким же: =

Так что да, это должно быть включенной для каждого .cpp-файла, в котором вы хотите его использовать, и он не будет «раздувать» вашу программу: он содержит только определения классов, внешние функции и т. д.

О, и это само собой разумеется, но C++ это очень обширный и сложный язык программирования, вам будет намного лучше узнать его через книгу, чем руководство. Если вы не хотите тратить деньги, бесплатная бесплатная (загружаемая) книга C++ - Thinking in C++, Bruce Eckel. В противном случае, если вы хотите его купить, вы можете найти хороший список here.

+0

Большое спасибо. Я буду помнить ваш совет. – aaron

+1

На SO: есть книжный список C++: http://stackoverflow.com/questions/388242/the-definitive-c-book-guide-and-list –

1

header.cpp только скомпилирован, если вы его скомпилируете. При компиляции test.cpp он автоматически не всасывается.Для того, чтобы произвести запуск программы, вы также должны связать полученные .o файлы в одном двоичном, следующим образом (упрощенно):

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

Вы компилировать каждый исходный файл по отдельности или вместе, затем связать полученные объектные модули.

E.g. Visual C++ (вместе)

или по отдельности,

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

Для того, чтобы получить результирующий EXE файл, foo.exe.

Кроме того, если header.cpp включает , почему я не могу использовать iostream вызовы функций в text.cpp, если он включен? Если включить iostream в text.cpp, он будет включен в программу дважды (другими словами, раздувание )?

Поскольку заголовки содержат только декларации, нет никакого вреда в их включении много раз. Они ничего не будут раздувать, поскольку компилятор отбрасывает их после проверки типа.

Хотя, если у вас есть определения типов в них, вам нужны #include охранники, чтобы типы не переопределялись.

Смежные вопросы