powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / [QT] QT-заголовок -- это единица трансляции.
25 сообщений из 33, страница 1 из 2
[QT] QT-заголовок -- это единица трансляции.
    #39444188
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вот не знал.

Заголовочный файл (.h) с QT-классами в QT-проекте тоже является единицей трансляции, а не только исходный файл (.cpp)
Происходит это из-за того, что заголовочные файлы преобразуются MOC-компилятором в исходные файлы и тоже полноценно транслируются.

Возможно, это для кого-то и не большое открытие, но я до настоящего времени это не понимал, и мне это мешало.
(но подозревал что-то такое где-то в глубине души).

----
Читал хинты оракла. Много думал...
...
Рейтинг: 0 / 0
[QT] QT-заголовок -- это единица трансляции.
    #39444192
Фотография NekZ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZiv,

Нет, хедеры -- это хедеры, а не единицы трансляции.
То, что ты добавляешь в список HEADERS, парсится сначала qmake'ом на предмет объявления QObject'ов, а затем уже создаются цели в виде файлов moc_<header_name>.cpp для реализации сигнал-слотового механизма и метаобъекта для данного класса(ов). Эти цели выполняет moc, которому скармливают на вход хедер, дефайны.Также эти цели сразу участвуют в компиляции объектных файлов moc_<header_name>.o, которые затем линкуются в бинарь. Именно поэтому вызовы сигналов (с emit, или без), напрямую идут в соответсвующие moc_<header_name>.cpp в дебаге.
...
Рейтинг: 0 / 0
[QT] QT-заголовок -- это единица трансляции.
    #39444247
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Поддержу MasterZiv'а

С традиционно точки зрения, "единица трансляции" это то, что превращается компилятором в объектный файл.
Однако, более общее определение: "минимальный блок исходного текста, который физически можно оттранслировать". Без уточнения оттранслировать во что конкретно...

С другой стороны, если вспомнить о существовании "прекомилированных заголовков", то заголовочные файлы неожиданно превращаются в "единицу трансляции" даже в формальном С (или С++).

Ну а так-как MOC делает трансляцию (.+).h в moc_$1.h и moc_$1.cpp, то получается что файлы перечисленные в HEADERS это действительно "единицы трансляции".
...
Рейтинг: 0 / 0
[QT] QT-заголовок -- это единица трансляции.
    #39444262
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вообще-то единица трансляции -- это объектный модуль, в рамках которого
формируются объекты, помещаемые в словарь внешних имён

формируются ссылки на другие объекты из словаря внешних имён.

В этом смысле заголовочный файл QT -- самая настоящая единица трансляции.
Так что не надо ля-ля :-)
...
Рейтинг: 0 / 0
[QT] QT-заголовок -- это единица трансляции.
    #39444751
Фотография NekZ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZiv,

Не согласен. Единица трансляции -- это термин, используемый в рамках конкретного компилятора.

Взято с русскоязычной Википедии.
White Owl Однако, более общее определение: "минимальный блок исходного текста, который физически можно оттранслировать". Без уточнения оттранслировать во что конкретно...

А вот что говорит стандарт C++
C++ standard rev N4140 2014-11-19A source file
together with all the headers (17.6.1.2) and source files included (16.2) via the preprocessing directive
#include, less any source lines skipped by any of the conditional inclusion (16.1) preprocessing directives, is
called a translation unit. [ Note: A C ++ program need not all be translated at the same time. — end note ]


Но, если, так сказать, посмотреть более широко, то можно назвать это translation unit'ом с точки зрения системы сборки.
Так сказать, одно имя в разных неймспейсах. Но, кому нужно вность эту путаницу?
...
Рейтинг: 0 / 0
[QT] QT-заголовок -- это единица трансляции.
    #39444912
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
NekZА вот что говорит стандарт C++
C++ standard rev N4140 2014-11-19A source file
together with all the headers (17.6.1.2) and source files included (16.2) via the preprocessing directive
#include, less any source lines skipped by any of the conditional inclusion (16.1) preprocessing directives, is
called a translation unit. [ Note: A C ++ program need not all be translated at the same time. — end note ]




С этой точки зрения заголовок QT -- тоже единица трансляции.
...
Рейтинг: 0 / 0
[QT] QT-заголовок -- это единица трансляции.
    #39444934
Фотография NekZ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZiv[
С этой точки зрения заголовок QT -- тоже единица трансляции.
Ни разу. В данной формулировке на первом месте идёт "source file", который является корнем для translation unit'а, в который включаются остальные файлы путём директив #include.
В случае Qt хедэра, он вообще логически "оторван" от соответсвующего moc_$1.cpp файла и не удовлетворяет требованию "source file". Это moc_$1.cpp является translation unit'ом, так как инклудит хедэр и имплементит часть его функциональности.
...
Рейтинг: 0 / 0
[QT] QT-заголовок -- это единица трансляции.
    #39444945
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
NekZMasterZiv[
С этой точки зрения заголовок QT -- тоже единица трансляции.
Ни разу. В данной формулировке на первом месте идёт "source file", который является корнем для translation unit'а, в который включаются остальные файлы путём директив #include.
В случае Qt хедэра, он вообще логически "оторван" от соответсвующего moc_$1.cpp файла и не удовлетворяет требованию "source file". Это moc_$1.cpp является translation unit'ом, так как инклудит хедэр и имплементит часть его функциональности.
Что значит "оторван"??? Это просто много-шаговая компиляция.
А вообще странно, автогенерацией исходников мы занимаеся уже черти-сколько лет. Некоторые языки вообще не компилируются напрямую а выдают код на Си, который уже и отдается в gcc. OCaml и Haskell например. И что ты назовешь единицей трансляции там?
...
Рейтинг: 0 / 0
[QT] QT-заголовок -- это единица трансляции.
    #39444951
Фотография NekZ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
White OwlЧто значит "оторван"??? Это просто много-шаговая компиляция.
А вообще странно, автогенерацией исходников мы занимаеся уже черти-сколько лет. Некоторые языки вообще не компилируются напрямую а выдают код на Си, который уже и отдается в gcc. OCaml и Haskell например. И что ты назовешь единицей трансляции там?
Предыдущее утверждение базируется строго на основе стандарта C++, мы о нём и говорим сейчас.
Оторван -- значит, что Qt-хедер ничего не знает про moc_$1.cpp (в нём нет директивы #include <moc_$1.cpp>, так?), соответственно, с точки зрения стандарта C++, он не является компилируемой единицей, он не подаётся на вход компилятору. УСЁ!
В проект можно понапихать ещё кучу генерённых файлов (из XML в CPP, например), но называть их единицами трансляции -- придумывание никому ненужной терминологии и внесение путаницы. Даже в той же Википедии так написано. Натягивать давно устоявшиеся термины на реальность не нужно.

Вопрос к ТС'у, откуда вообще инфа, или это просто ИМХО?
...
Рейтинг: 0 / 0
[QT] QT-заголовок -- это единица трансляции.
    #39444990
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
NekZПредыдущее утверждение базируется строго на основе стандарта C++, мы о нём и говорим сейчас.
Оторван -- значит, что Qt-хедер ничего не знает про moc_$1.cpp (в нём нет директивы #include <moc_$1.cpp>, так?),эээ... а когда это заголовочный файл знал о .cpp файлах??? Или если уж на то пошло, то с чего вдруг .cpp файл должен знать о полученном из него .o файле???
NekZ соответственно, с точки зрения стандарта C++, он не является компилируемой единицей, он не подаётся на вход компилятору. УСЁ!Еще раз напоминаю, что заголовочные файлы могут быть "прекомпилированы", и результат прекомпиляции это вполне себе объектный файл.

NekZВ проект можно понапихать ещё кучу генерённых файлов (из XML в CPP, например), но называть их единицами трансляции -- придумывание никому ненужной терминологии и внесение путаницы. Даже в той же Википедии так написано. Натягивать давно устоявшиеся термины на реальность не нужно.Генерированные файлы, это генерированные файлы. А вот то из чего они сгенерированны и факт что исходники прошли через процесс генерации по отдельности и делает эти исходные файлы единицами трансляции.
...
Рейтинг: 0 / 0
[QT] QT-заголовок -- это единица трансляции.
    #39445112
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
White Owlкомпилятору. УСЁ!Еще раз напоминаю, что заголовочные файлы могут быть "прекомпилированы", и результат прекомпиляции это вполне себе объектный файл.[/quot]

Сомневаюсь очень сильно.
...
Рейтинг: 0 / 0
[QT] QT-заголовок -- это единица трансляции.
    #39445157
Фотография NekZ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
White Owlэээ... а когда это заголовочный файл знал о .cpp файлах??? Или если уж на то пошло, то с чего вдруг .cpp файл должен знать о полученном из него .o файле???

Мне опять процитировать стандарт? .cpp удовлетворяет понятию "a source file", который оказывается в результате translation unit'ом, в то время как Qt-хедэр не является таковым, т.к. не подаётся на вход компилятору, не является корневым файлом компиляции.

White OwlГенерированные файлы, это генерированные файлы. А вот то из чего они сгенерированны и факт что исходники прошли через процесс генерации по отдельности и делает эти исходные файлы единицами трансляции.
Так ещё раз, откуда инфа? Я держусь в рамках стандарта C++ и там понятие единицы трансляции оговорено строго, ничего не написано про сгенерённые исходники.
...
Рейтинг: 0 / 0
[QT] QT-заголовок -- это единица трансляции.
    #39445271
Фотография NekZ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
White OwlГенерированные файлы, это генерированные файлы. А вот то из чего они сгенерированны и факт что исходники прошли через процесс генерации по отдельности и делает эти исходные файлы единицами трансляции.
Если удариться в крайность, то давай представим, что .cpp файлы генерируются на основе окружения, такое ведь может быть. Так что, теперь считать окружение единицей трансляции?
...
Рейтинг: 0 / 0
[QT] QT-заголовок -- это единица трансляции.
    #39445748
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
NekZWhite OwlГенерированные файлы, это генерированные файлы. А вот то из чего они сгенерированны и факт что исходники прошли через процесс генерации по отдельности и делает эти исходные файлы единицами трансляции.
Если удариться в крайность, то давай представим, что .cpp файлы генерируются на основе окружения, такое ведь может быть. Так что, теперь считать окружение единицей трансляции?То что подается на вход компилятору.


И кстати, если внимательно читать тот кусок стандарта который ты процитировал, то все что включается через #include так же входит в определение.
...
Рейтинг: 0 / 0
[QT] QT-заголовок -- это единица трансляции.
    #39445761
Фотография NekZ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
White OwlТо что подается на вход компилятору.

Да, Qt-хедеры не подаются на вход компилятору напрямую. Компилятор лишь видить moc_$1.cpp файлы и внутри них инклуды Qt-хедеров, как и кучи других хедеров, если они там есть. Но это не даёт право теперь именовать все хедеры единицами трансляции.

White OwlИ кстати, если внимательно читать тот кусок стандарта который ты процитировал, то все что включается через #include так же входит в определение.

C++ StandardA source file together with all the headers (17.6.1.2) and source files included (16.2) via the preprocessing directive #include, less any source lines skipped by any of the conditional inclusion (16.1) preprocessing directives, is called a translation unit.

Свой надмозгИсходный файл в совокупности со всеми заголовочными и исходными файлами, включёнными через препроцессорную директиву #include , за исключением строк, пропущенных из-за препроцессорных директив, называется единицей трансляции.

То есть, получается, что любые хедеры не являются единицами трансляции, так как в корне этого определения стоит исходный файл , в котором много-много хедеров, включенных через #include .

Qt-хедеры тут -- ни пришей, ни пристегни.
...
Рейтинг: 0 / 0
[QT] QT-заголовок -- это единица трансляции.
    #39445784
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
NekZ,

Думай как хочешь...

Но помни, что: "как вы яхту назовете, так она и поплывет".
И перечитай первый пост этого топика. Как минимум один человек имел проблемы от того что не достаточно точно называл свою яхту.
...
Рейтинг: 0 / 0
[QT] QT-заголовок -- это единица трансляции.
    #39446176
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
NekZТо есть, получается, что любые хедеры не являются единицами трансляции, так как в корне этого определения стоит исходный файл , в котором много-много хедеров, включенных через #include .

Qt-хедеры тут -- ни пришей, ни пристегни.

ЛЮБЫЕ хедеры НЕ ЯВЛЯЮТСЯ.
QT-шные хедеры, поскольку по ним генерируется код -- ЯВЛЯЮТСЯ.
...
Рейтинг: 0 / 0
[QT] QT-заголовок -- это единица трансляции.
    #39446252
Фотография NekZ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZivЛЮБЫЕ хедеры НЕ ЯВЛЯЮТСЯ.
QT-шные хедеры, поскольку по ним генерируется код -- ЯВЛЯЮТСЯ.
Ещё раз, как бывший инженер инженеру. Представь крайний случай, что код генерируется на основании окружения ОС или на основе фазы луны из данных обсерватории.
Теперь, окружение ОС и фаза луны теперь тоже являются единицами трансляции?
...
Рейтинг: 0 / 0
[QT] QT-заголовок -- это единица трансляции.
    #39446271
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
NekZMasterZivЛЮБЫЕ хедеры НЕ ЯВЛЯЮТСЯ.
QT-шные хедеры, поскольку по ним генерируется код -- ЯВЛЯЮТСЯ.
Ещё раз, как бывший инженер инженеру. Представь крайний случай, что код генерируется на основании окружения ОС или на основе фазы луны из данных обсерватории.
Теперь, окружение ОС и фаза луны теперь тоже являются единицами трансляции?Если они проходят через процесс отдельной компиляции, то да являются.
...
Рейтинг: 0 / 0
[QT] QT-заголовок -- это единица трансляции.
    #39446289
Фотография NekZ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
White OwlЕсли они проходят через процесс отдельной компиляции, то да являются.
Откуда информация?
...
Рейтинг: 0 / 0
[QT] QT-заголовок -- это единица трансляции.
    #39446697
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
NekZMasterZivЛЮБЫЕ хедеры НЕ ЯВЛЯЮТСЯ.
QT-шные хедеры, поскольку по ним генерируется код -- ЯВЛЯЮТСЯ.
Ещё раз, как бывший инженер инженеру. Представь крайний случай, что код генерируется на основании окружения ОС или на основе фазы луны из данных обсерватории.
Теперь, окружение ОС и фаза луны теперь тоже являются единицами трансляции?


ДА!

И знаешь, почему? Все просто!
Ты указываешь в своем проекте эти "фазы луны" - и у тебя есть неразрешенные внешние ссылки. Не указываешь с и их НЕТ!

Проблема-то с чего началась? Мне нужно было испытать некоторые классы, другие классы проекта им мешали. Соответственно, что мне нужно было бы сделать в обычном проекте, не QT? Выкинуть реализации (.cpp) ненужных классов из проекта на время. Выкидывать заголовки (.h) не обязательно, да во многих системах сборки заголовки и вообще не указываются в принципе никогда в проектах.
Заголовки, если они правильно оформлены, не могут формировать новые элементы в словарь внешних символов, не добавляют глобальные переменные и функции. Заголовки всегда вторичны.

А в QT -проектах это не так, заголовки самостоятельно компилируются и они формируют новые символы в словарь внешних символов. Из них даже наверное можно собрать работающую программу, вообще без единого .cpp!
...
Рейтинг: 0 / 0
[QT] QT-заголовок -- это единица трансляции.
    #39446698
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Как бы еще проще объяснить, совсем по-тупому ...

чтобы убрать класс из проекта, нужно выкинуть все ссылки на него, все его использование, выкинуть все включения его заголовков, и убрать из проекта его файл- реализации (.cpp).
В QT-проекте надо выкинуть из проекта также И ФАЙЛ ЗАГОЛОВКА КЛАССА. Иначе класс останется в программе.
...
Рейтинг: 0 / 0
[QT] QT-заголовок -- это единица трансляции.
    #39446792
Фотография NekZ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZiv,

Ты часто оперируешь словом "проект" в своих объяснениях. Однако, в рамках стандарта нет такого понятия. Но, это может быть либо qmake-проект, либо CMake-проект, либо SCons-проект, либо M$VS-проект, либо Makefile, либо тупо скрипт. Как в рамках каждого случая "выкинуть" Qt-хедер? Правильно, единообразного способа нет, везде по-разному.

А если я, например, уже имею Qt-хедер от какой-нибудь 3rd party библиотеки вместе со статической либой, в которой лежат объектные файлы moc и объектник к самому хедеру и которая линкуется в целевой бинарь и в рамках моего "проекта" её можно отключить "по щелчку пальцев" чтобы её символы не добавлялись в бинарь, то она является единицей трансляции?

Мне кажется, тут можно продолжать до бесконечности. А всё потому что ты пытаешься экстраполировать термин, имеющий строгие границы, на свой частный случай. Ещё можно придумать дохрена разный извращений как получить единицу трансляции в твоём понимании, но, тогда сам термин начнёт терять смысл, имея расплывчатые границы и его можно будет натянуть на что угодно.

Ну и напоследок, уже наболело: QT -- это Apple QuickTime, Qt -- это C++ фреймворк. Deal with it.
...
Рейтинг: 0 / 0
[QT] QT-заголовок -- это единица трансляции.
    #39446938
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
NekZТы часто оперируешь словом "проект" в своих объяснениях. Однако, в рамках стандарта нет такого понятия.В рамках стандарта очень много чего нет. В стандарте описан только один единственный язык, только один единственный способ использования языка.

Стандарт языка это вещь на которую надо ориентироваться человеку который пишет транслятор языка. Для всех остальных это всего-лишь полезное и забавное чтение которое может ввести в заблуждение.

NekZМне кажется, тут можно продолжать до бесконечности. А всё потому что ты пытаешься экстраполировать термин, имеющий строгие границы, на свой частный случай. Ещё можно придумать дохрена разный извращений как получить единицу трансляции в твоём понимании, но, тогда сам термин начнёт терять смысл, имея расплывчатые границы и его можно будет натянуть на что угодно.Ничего, ничего... начнешь писать проекты на десятке языков разом - отучишься от пагубной привычки ставить рамки на основе одного-единственного языка. Научишься обобщать, начнешь видеть тенденции, почувствуешь правильное понимание термина.
...
Рейтинг: 0 / 0
[QT] QT-заголовок -- это единица трансляции.
    #39446948
Фотография NekZ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
White OwlНичего, ничего... начнешь писать проекты на десятке языков разом - отучишься от пагубной привычки ставить рамки на основе одного-единственного языка. Научишься обобщать, начнешь видеть тенденции, почувствуешь правильное понимание термина.
Нет, спасибо, я уже вышел из IT и возвращаться не хочется.
А причём здесь другие языки? Мы в топике C++. Qt тоже держится в рамках этого языка.
...
Рейтинг: 0 / 0
25 сообщений из 33, страница 1 из 2
Форумы / C++ [игнор отключен] [закрыт для гостей] / [QT] QT-заголовок -- это единица трансляции.
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]