Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 21.12.2016, 13:22   #1
Андрей 93
Люблю жизнь
Форумчанин
 
Аватар для Андрей 93
 
Регистрация: 01.12.2009
Сообщений: 193
По умолчанию Если в основном файле проекта (где есть функция main) есть #include "file.hpp", и в файле file.cpp есть #include "file.hpp", то как компилятор узнает, что нам нужен файл file.cpp?

Вопрос по заголовочным файлам от новичка в C++. Если в основном файле проекта (где есть функция main) есть #include "file.hpp", и в файле file.cpp есть #include "file.hpp", то как компилятор узнаЁт, что нам нужен файл file.cpp? Он ведь нигде не прописан в коде.
И второй вопрос: если заголовочный файл file.hpp подключается дважды в разные файлы .cpp, то необходимо ли использовать #pragma once? (или #ifndef...)
Не стыдно не уметь, стыдно не учиться.

Последний раз редактировалось Андрей 93; 21.12.2016 в 15:53. Причина: узнает!=узнаёт
Андрей 93 вне форума Ответить с цитированием
Старый 21.12.2016, 13:31   #2
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,695
По умолчанию

Цитата:
то как компилятор узнает, что нам нужен файл file.cpp?
Вы ему сами скажите, например, добавив его в проект или передав в командной строке.

Цитата:
И второй вопрос: если заголовочный файл file.hpp подключается дважды в разные файлы .cpp, то необходимо ли использовать #pragma once? (или #ifndef...)
Использовать желательно всегда. Но в данном случае в большинстве вариантов проблем не будет, если вы не решить один cpp в другой подключить.
p51x вне форума Ответить с цитированием
Старый 21.12.2016, 13:37   #3
Alex11223
Старожил
 
Аватар для Alex11223
 
Регистрация: 12.01.2011
Сообщений: 19,500
По умолчанию

Цитата:
Сообщение от Андрей 93 Посмотреть сообщение
как компилятор узнает, что нам нужен файл file.cpp? Он ведь нигде не прописан в коде.
А как вы компилируете?
Компилятор указанные .cpp и компилирует.
Если бы вы использовали не IDE, а запускали GCC/MinGW из командной строки/Makefile, то этого вопроса не было бы
Ну и про линкер/этапы компиляции почитать.

http://stackoverflow.com/a/18777608/964478
Ушел с форума, https://www.programmersforum.rocks, alex.pantec@gmail.com, https://github.com/AlexP11223
ЛС отключены Аларом.

Последний раз редактировалось Alex11223; 21.12.2016 в 13:45.
Alex11223 вне форума Ответить с цитированием
Старый 21.12.2016, 15:25   #4
Андрей 93
Люблю жизнь
Форумчанин
 
Аватар для Андрей 93
 
Регистрация: 01.12.2009
Сообщений: 193
По умолчанию

Цитата:
Сообщение от p51x Посмотреть сообщение
Вы ему сами скажите, например, добавив его в проект или передав в командной строке.
Вот в том и дело, что я не говорю ему, а он сам включает .срр файл вместе с заголовочным =) Вопрос не в том, как сказать компилятору, чтобы он включил файл .срр в программу, а в том, почему он сам это делает? Это так принято?

Если я включу в файл main.cpp не sm_unit.hpp, a sm_unit.cpp, ничего не меняется. Всё отлично компилируется, и как по мне - даже логичнее выглядит
Не стыдно не уметь, стыдно не учиться.

Последний раз редактировалось Андрей 93; 21.12.2016 в 15:32.
Андрей 93 вне форума Ответить с цитированием
Старый 21.12.2016, 15:33   #5
Alex11223
Старожил
 
Аватар для Alex11223
 
Регистрация: 12.01.2011
Сообщений: 19,500
По умолчанию

Сами в проект добавляются? Может еще и код у вас сам пишется?
Ушел с форума, https://www.programmersforum.rocks, alex.pantec@gmail.com, https://github.com/AlexP11223
ЛС отключены Аларом.
Alex11223 вне форума Ответить с цитированием
Старый 21.12.2016, 15:37   #6
Андрей 93
Люблю жизнь
Форумчанин
 
Аватар для Андрей 93
 
Регистрация: 01.12.2009
Сообщений: 193
По умолчанию

Сами взгляните. В main.cpp подключен sm_unit.hpp, но не sm_unit.cpp
Вложения
Тип файла: rar Console app.rar (358.3 Кб, 14 просмотров)
Не стыдно не уметь, стыдно не учиться.
Андрей 93 вне форума Ответить с цитированием
Старый 21.12.2016, 15:40   #7
Alex11223
Старожил
 
Аватар для Alex11223
 
Регистрация: 12.01.2011
Сообщений: 19,500
По умолчанию

Причем тут .срр?
Смотрите файл проекта.

Код:
  <FILELIST>
      <FILE FILENAME="Project2.res" FORMNAME="" UNITNAME="Project2.res" CONTAINERID="ResTool" DESIGNCLASS="" LOCALCOMMAND=""/>
      <FILE FILENAME="Project2.bpf" FORMNAME="" UNITNAME="Project2" CONTAINERID="BPF" DESIGNCLASS="" LOCALCOMMAND=""/>
      <FILE FILENAME="main_unit.cpp" FORMNAME="" UNITNAME="main_unit" CONTAINERID="CCompiler" DESIGNCLASS="" LOCALCOMMAND=""/>
      <FILE FILENAME="sm_unit.cpp" FORMNAME="" UNITNAME="sm_unit" CONTAINERID="CCompiler" DESIGNCLASS="" LOCALCOMMAND=""/>
  </FILELIST>
Ушел с форума, https://www.programmersforum.rocks, alex.pantec@gmail.com, https://github.com/AlexP11223
ЛС отключены Аларом.
Alex11223 вне форума Ответить с цитированием
Старый 21.12.2016, 15:50   #8
Croessmah
Вредный кошак
Участник клуба
 
Аватар для Croessmah
 
Регистрация: 14.10.2012
Сообщений: 1,159
По умолчанию

Цитата:
Сообщение от Андрей 93 Посмотреть сообщение
то как компилятор узнает
Компилятору чхать. Он оставит это на совесть линкера.

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

Ознакомьтесь подробнее с процессом сборки.
Эта тема явно не для одного форумного поста.
А, судя по Вашим вопросам, объяснять нужно с самого нуля.

Хотя, если бы Вы собирали приложение не тыкая кнопки в IDE,
а используя простую консольку,
то всё было бы понятно уже с первых многофайловых проектов.

Последний раз редактировалось Croessmah; 21.12.2016 в 15:54.
Croessmah вне форума Ответить с цитированием
Старый 21.12.2016, 15:52   #9
Андрей 93
Люблю жизнь
Форумчанин
 
Аватар для Андрей 93
 
Регистрация: 01.12.2009
Сообщений: 193
По умолчанию

Что-то я запутался совсем. Если удалить эту строку из файла проекта, то ничего не изменится. И что такое вообще этот файл проекта, с чем его едят?
Прошу понять меня правильно, я хочу знать механизмы, как это всё работает, а не слепо действовать по шаблонам
Не стыдно не уметь, стыдно не учиться.
Андрей 93 вне форума Ответить с цитированием
Старый 21.12.2016, 15:55   #10
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,695
По умолчанию

Цитата:
Если удалить эту строку из файла проекта, то ничего не изменится.
Изменится

Цитата:
И что такое вообще этот файл проекта, с чем его едят?
Конфигурационный файл для компилятора и линкера. Что бы вам не приходилось каждый раз в консольке писать:
cl /MT /O2 ... .dfsd.c sdf.c dd.c /I ddfdfsds
link /nologo /PGO /dfs dfsd.o ...
p51x вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
C1083: Cannot open include file: 'd3dx9.h': No such file or directory CrowleyNoob Общие вопросы C/C++ 15 18.09.2016 21:55
visual studio не видит заголовочный файл, хотя он есть (fatal error C1083: Cannot open include file: 'GL/glut.h': No such file or sersheg Помощь студентам 0 21.10.2013 13:04
В чём разница между unit, header file, cpp file? TwiX Общие вопросы C/C++ 6 29.04.2012 19:49
Exception in thread "main" java.lang.ClassFormatError: Truncated class file Pti44ka Общие вопросы по Java, Java SE, Kotlin 1 19.11.2009 19:16
#include "anstream.hpp" Stefaniya Общие вопросы C/C++ 0 19.05.2009 02:40