crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )

 
Ответить в данную темуНачать новую тему
> Как правильно "инклюдить" файлы?
Litkevich Yuriy
  опции профиля:
сообщение 10.1.2010, 9:38
Сообщение #1


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9669
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

Спасибо сказали: 807 раз(а)




Репутация:   94  


Часть сообщения вынес сюда:
Цитата(deex @ 10.1.2010, 11:50) *
вот это и в примерах не понимал - если я буду инклудить 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  


Цитата(deex @ 10.1.2010, 13:10) *
считал что все работает через инклуды.
почти так и есть.

Собственно тут дело в том, что компилятор вообще ни на что кроме инклюдов не опирается. Если отказатся от pro-файла и make-файла, и компилировать руками, то нужно будет делать так:
g++ -c -o main.o main.cpp     -- компилируем main.cpp в объектный файл main.o
g++ -c -o pad.o pad.cpp         -- компилируем pad.cpp в объектный файл pad.o
g++ -o my.exe main.o pad.o  -- линкуем main.o и pad.o в исполняемый файл my.exe


Т.е. из примера видно, что компиляции подвергают CPP-файлы, а заголовочники нет. Т.к. компилятор Си/Си++ их включает, т.е. подставляет их содержимое целиком вместо соответствующей дерективы include, для компилятора главное найти эти заголовочники.

Попробуй провести эксперемент, вставь в cpp-файлы своего проекта вместо include "file" соответствующий файл. И ты увидишь то, как видит cpp-файлы сам компилятор

make-файлы генерятся именно так, чтобы запускать на компиляцию только cpp-файлы.

Вообще полезно на бумажке нарисовать как файлы включены друг в друга.
pad.h включен в main.cpp для тог, чтобы во время компиляции в main.cpp было видно объявление класса Pad.
Компилятор видит объявление этого класса и может проверить корректность использования этого класса в mai.cpp.

Для этих же целей он нужен и в pad.cpp.

А вот реальное связывание вызовов методов с самими методами делает линкер, у него на входе два объектных файла и там и там есть имя класса Pad, по этому имени и происходит связывание.

Это и минус Си/Си++, т.к. потенциально могут существовать независимые классы с одинаковыми именами (например большой проект использующий много сторонних библиотек), и компилятор может не осилить их связывание
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0




RSS Текстовая версия Сейчас: 26.12.2024, 18:43