Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности
|
|
|
[QT] QT-заголовок -- это единица трансляции.
|
|||
|---|---|---|---|
|
#18+
Вот не знал. Заголовочный файл (.h) с QT-классами в QT-проекте тоже является единицей трансляции, а не только исходный файл (.cpp) Происходит это из-за того, что заголовочные файлы преобразуются MOC-компилятором в исходные файлы и тоже полноценно транслируются. Возможно, это для кого-то и не большое открытие, но я до настоящего времени это не понимал, и мне это мешало. (но подозревал что-то такое где-то в глубине души). ---- Читал хинты оракла. Много думал... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.04.2017, 16:29 |
|
||
|
[QT] QT-заголовок -- это единица трансляции.
|
|||
|---|---|---|---|
|
#18+
MasterZiv, Нет, хедеры -- это хедеры, а не единицы трансляции. То, что ты добавляешь в список HEADERS, парсится сначала qmake'ом на предмет объявления QObject'ов, а затем уже создаются цели в виде файлов moc_<header_name>.cpp для реализации сигнал-слотового механизма и метаобъекта для данного класса(ов). Эти цели выполняет moc, которому скармливают на вход хедер, дефайны.Также эти цели сразу участвуют в компиляции объектных файлов moc_<header_name>.o, которые затем линкуются в бинарь. Именно поэтому вызовы сигналов (с emit, или без), напрямую идут в соответсвующие moc_<header_name>.cpp в дебаге. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.04.2017, 16:38 |
|
||
|
[QT] QT-заголовок -- это единица трансляции.
|
|||
|---|---|---|---|
|
#18+
Поддержу MasterZiv'а С традиционно точки зрения, "единица трансляции" это то, что превращается компилятором в объектный файл. Однако, более общее определение: "минимальный блок исходного текста, который физически можно оттранслировать". Без уточнения оттранслировать во что конкретно... С другой стороны, если вспомнить о существовании "прекомилированных заголовков", то заголовочные файлы неожиданно превращаются в "единицу трансляции" даже в формальном С (или С++). Ну а так-как MOC делает трансляцию (.+).h в moc_$1.h и moc_$1.cpp, то получается что файлы перечисленные в HEADERS это действительно "единицы трансляции". ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.04.2017, 18:17 |
|
||
|
[QT] QT-заголовок -- это единица трансляции.
|
|||
|---|---|---|---|
|
#18+
Вообще-то единица трансляции -- это объектный модуль, в рамках которого формируются объекты, помещаемые в словарь внешних имён формируются ссылки на другие объекты из словаря внешних имён. В этом смысле заголовочный файл QT -- самая настоящая единица трансляции. Так что не надо ля-ля :-) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.04.2017, 18:44 |
|
||
|
[QT] QT-заголовок -- это единица трансляции.
|
|||
|---|---|---|---|
|
#18+
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'ом с точки зрения системы сборки. Так сказать, одно имя в разных неймспейсах. Но, кому нужно вность эту путаницу? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.04.2017, 13:47 |
|
||
|
[QT] QT-заголовок -- это единица трансляции.
|
|||
|---|---|---|---|
|
#18+
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 -- тоже единица трансляции. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.04.2017, 16:51 |
|
||
|
[QT] QT-заголовок -- это единица трансляции.
|
|||
|---|---|---|---|
|
#18+
MasterZiv[ С этой точки зрения заголовок QT -- тоже единица трансляции. Ни разу. В данной формулировке на первом месте идёт "source file", который является корнем для translation unit'а, в который включаются остальные файлы путём директив #include. В случае Qt хедэра, он вообще логически "оторван" от соответсвующего moc_$1.cpp файла и не удовлетворяет требованию "source file". Это moc_$1.cpp является translation unit'ом, так как инклудит хедэр и имплементит часть его функциональности. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.04.2017, 17:22 |
|
||
|
[QT] QT-заголовок -- это единица трансляции.
|
|||
|---|---|---|---|
|
#18+
NekZMasterZiv[ С этой точки зрения заголовок QT -- тоже единица трансляции. Ни разу. В данной формулировке на первом месте идёт "source file", который является корнем для translation unit'а, в который включаются остальные файлы путём директив #include. В случае Qt хедэра, он вообще логически "оторван" от соответсвующего moc_$1.cpp файла и не удовлетворяет требованию "source file". Это moc_$1.cpp является translation unit'ом, так как инклудит хедэр и имплементит часть его функциональности. Что значит "оторван"??? Это просто много-шаговая компиляция. А вообще странно, автогенерацией исходников мы занимаеся уже черти-сколько лет. Некоторые языки вообще не компилируются напрямую а выдают код на Си, который уже и отдается в gcc. OCaml и Haskell например. И что ты назовешь единицей трансляции там? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.04.2017, 17:43 |
|
||
|
[QT] QT-заголовок -- это единица трансляции.
|
|||
|---|---|---|---|
|
#18+
White OwlЧто значит "оторван"??? Это просто много-шаговая компиляция. А вообще странно, автогенерацией исходников мы занимаеся уже черти-сколько лет. Некоторые языки вообще не компилируются напрямую а выдают код на Си, который уже и отдается в gcc. OCaml и Haskell например. И что ты назовешь единицей трансляции там? Предыдущее утверждение базируется строго на основе стандарта C++, мы о нём и говорим сейчас. Оторван -- значит, что Qt-хедер ничего не знает про moc_$1.cpp (в нём нет директивы #include <moc_$1.cpp>, так?), соответственно, с точки зрения стандарта C++, он не является компилируемой единицей, он не подаётся на вход компилятору. УСЁ! В проект можно понапихать ещё кучу генерённых файлов (из XML в CPP, например), но называть их единицами трансляции -- придумывание никому ненужной терминологии и внесение путаницы. Даже в той же Википедии так написано. Натягивать давно устоявшиеся термины на реальность не нужно. Вопрос к ТС'у, откуда вообще инфа, или это просто ИМХО? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.04.2017, 17:56 |
|
||
|
[QT] QT-заголовок -- это единица трансляции.
|
|||
|---|---|---|---|
|
#18+
NekZПредыдущее утверждение базируется строго на основе стандарта C++, мы о нём и говорим сейчас. Оторван -- значит, что Qt-хедер ничего не знает про moc_$1.cpp (в нём нет директивы #include <moc_$1.cpp>, так?),эээ... а когда это заголовочный файл знал о .cpp файлах??? Или если уж на то пошло, то с чего вдруг .cpp файл должен знать о полученном из него .o файле??? NekZ соответственно, с точки зрения стандарта C++, он не является компилируемой единицей, он не подаётся на вход компилятору. УСЁ!Еще раз напоминаю, что заголовочные файлы могут быть "прекомпилированы", и результат прекомпиляции это вполне себе объектный файл. NekZВ проект можно понапихать ещё кучу генерённых файлов (из XML в CPP, например), но называть их единицами трансляции -- придумывание никому ненужной терминологии и внесение путаницы. Даже в той же Википедии так написано. Натягивать давно устоявшиеся термины на реальность не нужно.Генерированные файлы, это генерированные файлы. А вот то из чего они сгенерированны и факт что исходники прошли через процесс генерации по отдельности и делает эти исходные файлы единицами трансляции. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.04.2017, 19:21 |
|
||
|
[QT] QT-заголовок -- это единица трансляции.
|
|||
|---|---|---|---|
|
#18+
White Owlкомпилятору. УСЁ!Еще раз напоминаю, что заголовочные файлы могут быть "прекомпилированы", и результат прекомпиляции это вполне себе объектный файл.[/quot] Сомневаюсь очень сильно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.04.2017, 00:33 |
|
||
|
[QT] QT-заголовок -- это единица трансляции.
|
|||
|---|---|---|---|
|
#18+
White Owlэээ... а когда это заголовочный файл знал о .cpp файлах??? Или если уж на то пошло, то с чего вдруг .cpp файл должен знать о полученном из него .o файле??? Мне опять процитировать стандарт? .cpp удовлетворяет понятию "a source file", который оказывается в результате translation unit'ом, в то время как Qt-хедэр не является таковым, т.к. не подаётся на вход компилятору, не является корневым файлом компиляции. White OwlГенерированные файлы, это генерированные файлы. А вот то из чего они сгенерированны и факт что исходники прошли через процесс генерации по отдельности и делает эти исходные файлы единицами трансляции. Так ещё раз, откуда инфа? Я держусь в рамках стандарта C++ и там понятие единицы трансляции оговорено строго, ничего не написано про сгенерённые исходники. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.04.2017, 07:47 |
|
||
|
[QT] QT-заголовок -- это единица трансляции.
|
|||
|---|---|---|---|
|
#18+
White OwlГенерированные файлы, это генерированные файлы. А вот то из чего они сгенерированны и факт что исходники прошли через процесс генерации по отдельности и делает эти исходные файлы единицами трансляции. Если удариться в крайность, то давай представим, что .cpp файлы генерируются на основе окружения, такое ведь может быть. Так что, теперь считать окружение единицей трансляции? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.04.2017, 11:03 |
|
||
|
[QT] QT-заголовок -- это единица трансляции.
|
|||
|---|---|---|---|
|
#18+
NekZWhite OwlГенерированные файлы, это генерированные файлы. А вот то из чего они сгенерированны и факт что исходники прошли через процесс генерации по отдельности и делает эти исходные файлы единицами трансляции. Если удариться в крайность, то давай представим, что .cpp файлы генерируются на основе окружения, такое ведь может быть. Так что, теперь считать окружение единицей трансляции?То что подается на вход компилятору. И кстати, если внимательно читать тот кусок стандарта который ты процитировал, то все что включается через #include так же входит в определение. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.04.2017, 20:29 |
|
||
|
[QT] QT-заголовок -- это единица трансляции.
|
|||
|---|---|---|---|
|
#18+
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-хедеры тут -- ни пришей, ни пристегни. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.04.2017, 21:22 |
|
||
|
[QT] QT-заголовок -- это единица трансляции.
|
|||
|---|---|---|---|
|
#18+
NekZ, Думай как хочешь... Но помни, что: "как вы яхту назовете, так она и поплывет". И перечитай первый пост этого топика. Как минимум один человек имел проблемы от того что не достаточно точно называл свою яхту. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.04.2017, 23:45 |
|
||
|
[QT] QT-заголовок -- это единица трансляции.
|
|||
|---|---|---|---|
|
#18+
NekZТо есть, получается, что любые хедеры не являются единицами трансляции, так как в корне этого определения стоит исходный файл , в котором много-много хедеров, включенных через #include . Qt-хедеры тут -- ни пришей, ни пристегни. ЛЮБЫЕ хедеры НЕ ЯВЛЯЮТСЯ. QT-шные хедеры, поскольку по ним генерируется код -- ЯВЛЯЮТСЯ. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.04.2017, 14:44 |
|
||
|
[QT] QT-заголовок -- это единица трансляции.
|
|||
|---|---|---|---|
|
#18+
MasterZivЛЮБЫЕ хедеры НЕ ЯВЛЯЮТСЯ. QT-шные хедеры, поскольку по ним генерируется код -- ЯВЛЯЮТСЯ. Ещё раз, как бывший инженер инженеру. Представь крайний случай, что код генерируется на основании окружения ОС или на основе фазы луны из данных обсерватории. Теперь, окружение ОС и фаза луны теперь тоже являются единицами трансляции? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.04.2017, 16:38 |
|
||
|
[QT] QT-заголовок -- это единица трансляции.
|
|||
|---|---|---|---|
|
#18+
NekZMasterZivЛЮБЫЕ хедеры НЕ ЯВЛЯЮТСЯ. QT-шные хедеры, поскольку по ним генерируется код -- ЯВЛЯЮТСЯ. Ещё раз, как бывший инженер инженеру. Представь крайний случай, что код генерируется на основании окружения ОС или на основе фазы луны из данных обсерватории. Теперь, окружение ОС и фаза луны теперь тоже являются единицами трансляции?Если они проходят через процесс отдельной компиляции, то да являются. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.04.2017, 17:02 |
|
||
|
[QT] QT-заголовок -- это единица трансляции.
|
|||
|---|---|---|---|
|
#18+
White OwlЕсли они проходят через процесс отдельной компиляции, то да являются. Откуда информация? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.04.2017, 17:44 |
|
||
|
[QT] QT-заголовок -- это единица трансляции.
|
|||
|---|---|---|---|
|
#18+
NekZMasterZivЛЮБЫЕ хедеры НЕ ЯВЛЯЮТСЯ. QT-шные хедеры, поскольку по ним генерируется код -- ЯВЛЯЮТСЯ. Ещё раз, как бывший инженер инженеру. Представь крайний случай, что код генерируется на основании окружения ОС или на основе фазы луны из данных обсерватории. Теперь, окружение ОС и фаза луны теперь тоже являются единицами трансляции? ДА! И знаешь, почему? Все просто! Ты указываешь в своем проекте эти "фазы луны" - и у тебя есть неразрешенные внешние ссылки. Не указываешь с и их НЕТ! Проблема-то с чего началась? Мне нужно было испытать некоторые классы, другие классы проекта им мешали. Соответственно, что мне нужно было бы сделать в обычном проекте, не QT? Выкинуть реализации (.cpp) ненужных классов из проекта на время. Выкидывать заголовки (.h) не обязательно, да во многих системах сборки заголовки и вообще не указываются в принципе никогда в проектах. Заголовки, если они правильно оформлены, не могут формировать новые элементы в словарь внешних символов, не добавляют глобальные переменные и функции. Заголовки всегда вторичны. А в QT -проектах это не так, заголовки самостоятельно компилируются и они формируют новые символы в словарь внешних символов. Из них даже наверное можно собрать работающую программу, вообще без единого .cpp! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.04.2017, 08:56 |
|
||
|
[QT] QT-заголовок -- это единица трансляции.
|
|||
|---|---|---|---|
|
#18+
Как бы еще проще объяснить, совсем по-тупому ... чтобы убрать класс из проекта, нужно выкинуть все ссылки на него, все его использование, выкинуть все включения его заголовков, и убрать из проекта его файл- реализации (.cpp). В QT-проекте надо выкинуть из проекта также И ФАЙЛ ЗАГОЛОВКА КЛАССА. Иначе класс останется в программе. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.04.2017, 09:16 |
|
||
|
[QT] QT-заголовок -- это единица трансляции.
|
|||
|---|---|---|---|
|
#18+
MasterZiv, Ты часто оперируешь словом "проект" в своих объяснениях. Однако, в рамках стандарта нет такого понятия. Но, это может быть либо qmake-проект, либо CMake-проект, либо SCons-проект, либо M$VS-проект, либо Makefile, либо тупо скрипт. Как в рамках каждого случая "выкинуть" Qt-хедер? Правильно, единообразного способа нет, везде по-разному. А если я, например, уже имею Qt-хедер от какой-нибудь 3rd party библиотеки вместе со статической либой, в которой лежат объектные файлы moc и объектник к самому хедеру и которая линкуется в целевой бинарь и в рамках моего "проекта" её можно отключить "по щелчку пальцев" чтобы её символы не добавлялись в бинарь, то она является единицей трансляции? Мне кажется, тут можно продолжать до бесконечности. А всё потому что ты пытаешься экстраполировать термин, имеющий строгие границы, на свой частный случай. Ещё можно придумать дохрена разный извращений как получить единицу трансляции в твоём понимании, но, тогда сам термин начнёт терять смысл, имея расплывчатые границы и его можно будет натянуть на что угодно. Ну и напоследок, уже наболело: QT -- это Apple QuickTime, Qt -- это C++ фреймворк. Deal with it. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.04.2017, 21:36 |
|
||
|
[QT] QT-заголовок -- это единица трансляции.
|
|||
|---|---|---|---|
|
#18+
NekZТы часто оперируешь словом "проект" в своих объяснениях. Однако, в рамках стандарта нет такого понятия.В рамках стандарта очень много чего нет. В стандарте описан только один единственный язык, только один единственный способ использования языка. Стандарт языка это вещь на которую надо ориентироваться человеку который пишет транслятор языка. Для всех остальных это всего-лишь полезное и забавное чтение которое может ввести в заблуждение. NekZМне кажется, тут можно продолжать до бесконечности. А всё потому что ты пытаешься экстраполировать термин, имеющий строгие границы, на свой частный случай. Ещё можно придумать дохрена разный извращений как получить единицу трансляции в твоём понимании, но, тогда сам термин начнёт терять смысл, имея расплывчатые границы и его можно будет натянуть на что угодно.Ничего, ничего... начнешь писать проекты на десятке языков разом - отучишься от пагубной привычки ставить рамки на основе одного-единственного языка. Научишься обобщать, начнешь видеть тенденции, почувствуешь правильное понимание термина. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.05.2017, 19:10 |
|
||
|
[QT] QT-заголовок -- это единица трансляции.
|
|||
|---|---|---|---|
|
#18+
White OwlНичего, ничего... начнешь писать проекты на десятке языков разом - отучишься от пагубной привычки ставить рамки на основе одного-единственного языка. Научишься обобщать, начнешь видеть тенденции, почувствуешь правильное понимание термина. Нет, спасибо, я уже вышел из IT и возвращаться не хочется. А причём здесь другие языки? Мы в топике C++. Qt тоже держится в рамках этого языка. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.05.2017, 19:37 |
|
||
|
|

start [/forum/topic.php?desktop=1&fid=57&tid=2018182]: |
0ms |
get settings: |
12ms |
get forum list: |
13ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
39ms |
get topic data: |
12ms |
get forum data: |
3ms |
get page messages: |
59ms |
get tp. blocked users: |
2ms |
| others: | 13ms |
| total: | 161ms |

| 0 / 0 |
