C ++ включает .h включает также .cpp с тем же именем? - PullRequest
7 голосов
/ 04 апреля 2010

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

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

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

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

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

Ответы [ 3 ]

4 голосов
/ 04 апреля 2010

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

Например, если вы используете 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

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

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


Теперь по другому вопросу:

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

#include говорит компилятору просто «скопировать все содержимое включаемого вами файла и вставить его туда, где находится строка #include». Таким образом, теоретически вы можете просто открыть iostream с помощью блокнота, выбрать все, Ctrl-C и Ctrl-V его в вашем файле .cpp, и конечный эффект будет точно такой же =)

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

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

1 голос
/ 04 апреля 2010

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

c++ -c test.cpp
c++ -c header.cpp
c++ -o test test.o header.o
0 голосов
/ 04 апреля 2010

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

например. Visual C ++ (вместе)

cl text.cpp header.cpp /Fefoo

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

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, чтобы типы не переопределялись.

...