C++ включает.h, включает .cpp с тем же именем также?

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

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

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

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

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

7
задан Thomas Bonini 4 April 2010 в 04:35
поделиться

3 ответа

Вы указываете своему компилятору, какие файлы 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 включает {{1} } iostream, почему я не могу использовать вызовы функций iostream в text.cpp, если он включен? Если я включу iostream в text.cpp, будет ли он включен в программу дважды (другими словами, раздувать его)?

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

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

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

4
ответ дан 7 December 2019 в 12:18
поделиться

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

c++ -c test.cpp
c++ -c header.cpp
c++ -o test test.o header.o
1
ответ дан 7 December 2019 в 12:18
поделиться

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

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

0
ответ дан 7 December 2019 в 12:18
поделиться
Другие вопросы по тегам:

Похожие вопросы: