Здравствуйте, physic, Вы писали:
P>как можно назвать обработку и подклучение *.h файла в C++ проекте?
Дело в том что *.h файл подключается к *.cpp или *.h файлу препроцессором, а вот когда у компилятора есть полностью скомпонованная единица трансляции *.cpp + все необходимые *.h файлы, тогда компилятор компилит весь получившийся текст. Отсюда можно заключить что *.h файл компилится после обработки препроцессора.
Для начала — забудьте про такое понятие — расширение файла. И соответственно все предрассудки — что .cpp — для кода а .h для объявления. Компиляторы компилируют то что задано в файлах проекта или make-файлах. А заданы там для компиляции обычно только .cpp файлы (вижул так сам делает всегда).
А все что пишется в #include просто вставляется в исходник компилируемого файла. Т.е компилятор сам делает copy-paste текста из заданного файла на место директивы #include. А потом делает copy-paste для всех инклудов что были во включенном файле.. и тп -рекурсивно пока не получился один здоровенннный листинг который и скомпилирцется и из которого и получится файл helloworld.obj
Здравствуйте, Alxndr, Вы писали:
A>Здравствуйте, physic, Вы писали:
P>>как можно назвать обработку и подклучение *.h файла в C++ проекте?
A>Препроцессингом?
Разве я думал что препроцессор работает после директивы #
Здравствуйте, Alxndr, Вы писали:
A>Здравствуйте, physic, Вы писали:
P>>как можно назвать обработку и подклучение *.h файла в C++ проекте?
A>Препроцессингом?
В .h объявляются ф-ии, т.д. Возможна реализация, но не инициализация. Таким образом, всё что будет необходимо твоему *.c будет взято из *.h, остальное игнорируется. Определение включению заголовочных файлов не скажу, не задавался таким вопросом, раньше не где ни встречал.
Здравствуйте, physic, Вы писали:
P>Здравствуйте, Alxndr, Вы писали:
A>>Здравствуйте, physic, Вы писали:
P>>>как можно назвать обработку и подклучение *.h файла в C++ проекте?
A>>Препроцессингом?
P>Разве я думал что препроцессор работает после директивы #
*.h файлы компилятором не обрабатываются.
Обрабатываются *.c (*.cpp и т.п.) файлы.
Включение (рекурсивное) инклюдов выполняется при препроцессинге.
Здравствуйте, physic, Вы писали:
P>Вот тут я не согласен ... В *.h файле те же объявления которые могли бы быть и в *.сpp файле, и эти объявления компилируются в бинарный код.
Здравствуйте, physic, Вы писали:
P>Здравствуйте, Alxndr, Вы писали:
A>>*.h файлы компилятором не обрабатываются.
P>Вот тут я не согласен ... В *.h файле те же объявления которые могли бы быть и в *.сpp файле, и эти объявления компилируются в бинарный код.
Здравствуйте, physic, Вы писали:
P>Здравствуйте, physic, Вы писали:
P>>как можно назвать обработку и подклучение *.h файла в C++ проекте?
P>Дело в том что *.h файл подключается к *.cpp или *.h файлу препроцессором, а вот когда у компилятора есть полностью скомпонованная единица трансляции *.cpp + все необходимые *.h файлы, тогда компилятор компилит весь получившийся текст. Отсюда можно заключить что *.h файл компилится после обработки препроцессора.
Путаница в терминологии
Компилятор компилирует единицы трансляции.
В системах, где исходные тексты хранятся в файлах, единица трансляции — это файл, обработанный препроцессорос с рекурсивно включенными *.h-файлами.
Здравствуйте, physic, Вы писали:
P>Вот тут я не согласен ... В *.h файле те же объявления которые могли бы быть и в *.сpp файле, и эти объявления компилируются в бинарный код.
При чем здесь объявления? .
Вот пример:
До препроцессинга:
// header1.hvoid some_external_func();
class SomeClass {};
Компилятор строит свои внутренние таблицы: функция, параметр, возвращаемое значение; а более что ещё можно сделать?
Потом эти таблицы не трогаются если *.h не меняется. А если меняется, то таблица перестраивается, и компилятся все файлы куда он входил. Что-то вроде этого. Что за код может сгенириться из объявлений?
Crackjack wrote:
> A>Препроцессингом? > > В .h объявляются ф-ии, т.д. Возможна реализация, но не инициализация.
Там возможно всё что угодно. Правда в некоторых случаях (когда один h включается из нескольких cpp) программа не слинкуется.
> Таким образом, всё что будет необходимо твоему *.c будет взято из *.h, > остальное игнорируется. Определение включению заголовочных файлов не > скажу, не задавался таким вопросом, раньше не где ни встречал.
Обработка .h файлов идёт до компиляции. Компилятор вообще ничего про файлы не знает.
.cpp и .h файлы — чистая условность. Просто так договорились, языку до этого пофиг. Называй файлы как хочешь и что
угодно куда угодно подключай.
Posted via RSDN NNTP Server 2.0
но это не зря, хотя, может быть, невзначай
гÅрмония мира не знает границ — сейчас мы будем пить чай
"physic" <52389@users.rsdn.ru> wrote in message news:1786412@news.rsdn.ru... > Здравствуйте, Alxndr, Вы писали: > > A>Здравствуйте, physic, Вы писали: > > P>>как можно назвать обработку и подклучение *.h файла в C++ проекте? > > A>Препроцессингом? > > Разве я думал что препроцессор работает после директивы #
Так и есть: препроцессор обрабатывает директиву #include, подставляя все(или не все, или не подставляя, в зависимости от других директив препроцессора), что написано в h-файле в текст, который в дальнейшем передается компилятору.
Компилятору уже безразлично, в каком файле написан тот или иной фрагмент текста программы.
Posted via RSDN NNTP Server 1.9
--
Справедливость выше закона. А человечность выше справедливости.
Здравствуйте, Аноним, Вы писали:
А>Для начала — забудьте про такое понятие — расширение файла. И соответственно все предрассудки — что .cpp — для кода а .h для объявления. Компиляторы компилируют то что задано в файлах проекта или make-файлах. А заданы там для компиляции обычно только .cpp файлы (вижул так сам делает всегда). А>А все что пишется в #include просто вставляется в исходник компилируемого файла. Т.е компилятор сам делает copy-paste текста из заданного файла на место директивы #include. А потом делает copy-paste для всех инклудов что были во включенном файле.. и тп -рекурсивно пока не получился один здоровенннный листинг который и скомпилирцется и из которого и получится файл helloworld.obj
именно
Плюс можно вспомнить про precompiled header(msdn). Он применяется как раз для того, чтобы не компилировать многократно одни и те же куски кода, и представляет собой the state of compilation at a certain point.
Здравствуйте, physic, Вы писали:
P>как можно назвать обработку и подклучение *.h файла в C++ проекте?
Если под .h-файлами имеются в виду файлы, включаемые в компилируемый файл через директиву '#include', то в традиционной реализации содержимое этих файлов непостредственно обрабатывается только препроцессором. Препроцессор включает содержимое этих файлов в соответствушие места компилируемого файла, в результате чего получается "плоский" финальный файл без каких-либо директив '#include', который и попадает на компиляцию. В этом финальном файле нет никакой разницы, между кодом, пришедшим из разных .h-файлов через '#include' и кодом, который там был изначально. Все компилируется вместе.
Таким образом, отвечая на вопрос заданный в заголовке сообщения, сами .h-файлы не компилируются (в узком понитмании термина "компляция"). Содержимое же этих файлов, после соответствующей подстановки, компилируется вместе со всем остальным кодом.
Здравствуйте, Crackjack, Вы писали:
P>>>как можно назвать обработку и подклучение *.h файла в C++ проекте?
A>>Препроцессингом?
C>В .h объявляются ф-ии, т.д. Возможна реализация, но не инициализация. Таким образом, всё что будет необходимо твоему *.c будет взято из *.h, остальное игнорируется. Определение включению заголовочных файлов не скажу, не задавался таким вопросом, раньше не где ни встречал.
.h-файлы, точнее директива перпроцессора '#include', допускает множество разнообразных применений, в том числе никоим образом не связанных с какими-то "реализациями", "инициализациями" и "взятием того, что необходимо". Обработка включаемых файлов в системе трансляции С/С++ выполняется текстовым препроцессором, который не имеет ни малейшего представления о языках С/С++ как таковых. Соответственно, никаких чисто языковых зависимостей это процесс иметь не может. С таким же успехом, с которым препроцессор может использваться для вставки объявлений в единицу трансляции, он модет использоваться для вставки гитарных табов в текст "Песни о юном барабанщике".
Здравствуйте, Chipsеt, Вы писали:
C>Прикольно реализовано в Boost.Test, там реализация лежит в *.ipp которая инклюдиться в файл, в первый раз такое вижу.
Эта реализация совершенно случайно не генерируется автоматом? (просто гипотеза, нет времени сейчас посмотреть).
Здравствуйте, physic, Вы писали:
P>как можно назвать обработку и подклучение *.h файла в C++ проекте?
К сказанному выше, хочу добывить вот что.
Некоторые наверно считают что в проект (в данном случае это MSVC, но думаю что и в других ИДЕ так) не обязательно включать заголовочные файлы, а достаточно токо одних единиц трансляции (cpp/rc/и т.д.), так вот это не совсем так.
Сам сталкивался с такими проблемами, когда в папке с исходниками лежали нужные хедеры, а на их включение в какой нить cpp через #include "bla-bla/bla-bla.h" компилятор ругался, пока bla-bla.h не был добавлен в проект
[In theory there is no difference between theory and practice. In
practice there is.]
[Даю очевидные ответы на риторические вопросы]
Здравствуйте, Alxndr, Вы писали:
A>Здравствуйте, Chipsеt, Вы писали:
C>>Прикольно реализовано в Boost.Test, там реализация лежит в *.ipp которая инклюдиться в файл, в первый раз такое вижу.
A>Эта реализация совершенно случайно не генерируется автоматом? (просто гипотеза, нет времени сейчас посмотреть).