Как правильно "инклюдить" файлы? |
Здравствуйте, гость ( Вход | Регистрация )
Как правильно "инклюдить" файлы? |
Litkevich Yuriy |
10.1.2010, 9:38
Сообщение
#1
|
разработчик РЭА Группа: Сомодератор Сообщений: 9669 Регистрация: 9.1.2008 Из: Тюмень Пользователь №: 64 Спасибо сказали: 807 раз(а) Репутация: 94 |
Часть сообщения вынес сюда:
вот это и в примерах не понимал - если я буду инклудить pad.h, то как в проект попадет pad.cpp? т.к. он тоже сейчас инклудит pad.h, но pad.h не инклудит его. и в примерах также - main.cpp инклудит .h, класс.cpp инклудит .h, а сам .h не инклудит ничего Чтобы понять, что и куда инклюдить, нужно понять зачем это вообще делается. Если хочешь с этим разобраться, то сделай файл проекта (pro-файл) для своей программы из этой темы А потом будут наводящие вопросы и пояснения. |
|
|
deex |
10.1.2010, 10:10
Сообщение
#2
|
Студент Группа: Участник Сообщений: 45 Регистрация: 12.3.2009 Пользователь №: 608 Спасибо сказали: 0 раз(а) Репутация: 0 |
начинаю понимать
по ходу компилятор опирается только на то, что написано в .pro если там написать HEADERS += pad.h SOURCES += main.cpp pad.cpp то вся, кажущаяся на первый взгляд нелогичной, система инклудов работает правильно. у меня же qmake генерил неправильный pro HEADERS += pad.h pad.cpp <-- pad.cpp попал и сюда, потому что его инклудит main SOURCES += main.cpp pad.cpp я, так сказать, "вырос" на php, поэтому считал что все работает через инклуды. хотелось бы ещё комментариев по устройству механизма инклудов в С++ или ссылку на доки, чтобы окончательно заполнить пробелы в знаниях. спасибо за наводку. |
|
|
Litkevich Yuriy |
10.1.2010, 10:59
Сообщение
#3
|
разработчик РЭА Группа: Сомодератор Сообщений: 9669 Регистрация: 9.1.2008 Из: Тюмень Пользователь №: 64 Спасибо сказали: 807 раз(а) Репутация: 94 |
считал что все работает через инклуды. почти так и есть.Собственно тут дело в том, что компилятор вообще ни на что кроме инклюдов не опирается. Если отказатся от pro-файла и make-файла, и компилировать руками, то нужно будет делать так:
Т.е. из примера видно, что компиляции подвергают CPP-файлы, а заголовочники нет. Т.к. компилятор Си/Си++ их включает, т.е. подставляет их содержимое целиком вместо соответствующей дерективы include, для компилятора главное найти эти заголовочники. Попробуй провести эксперемент, вставь в cpp-файлы своего проекта вместо include "file" соответствующий файл. И ты увидишь то, как видит cpp-файлы сам компилятор make-файлы генерятся именно так, чтобы запускать на компиляцию только cpp-файлы. Вообще полезно на бумажке нарисовать как файлы включены друг в друга. pad.h включен в main.cpp для тог, чтобы во время компиляции в main.cpp было видно объявление класса Pad. Компилятор видит объявление этого класса и может проверить корректность использования этого класса в mai.cpp. Для этих же целей он нужен и в pad.cpp. А вот реальное связывание вызовов методов с самими методами делает линкер, у него на входе два объектных файла и там и там есть имя класса Pad, по этому имени и происходит связывание. Это и минус Си/Си++, т.к. потенциально могут существовать независимые классы с одинаковыми именами (например большой проект использующий много сторонних библиотек), и компилятор может не осилить их связывание |
|
|
Текстовая версия | Сейчас: 27.12.2024, 8:15 |