Здравствуйте, Shmj, Вы писали:
S>В чем разница и как лучше — включать или просто объявлять?
если включать, то QLocalServer.h и всё что в нём будет разбираться компилятором при каждом включении нашего заголовочного файла
если объявлять, этого не происходит и таким образом мы повышаем скорость сборки
Но не всё однозначно конечно. При объявлении несколько сложнее рефакторинг (заменили class на struct, поменяли имя и т. д.). Да и вообще это выглядит как костыль (а на самом деле таким и является).
Re: Линковка - как понять C#-овскими мозгами (на примере)?
S>Здесь есть include а есть просто декларация class QLocalServer. А ведь можно сделать и #include <QLocalServer> и тоже будет работать. S>В чем разница и как лучше — включать или просто объявлять?
Можно не значит нужно. Общий принцип такой, что не следует подключать заголовок с полным определением класса там, где можно обойтись предварительным объявлением. Минимизация включения заголовочных файлов нужна не только для уменьшения времени компиляции, но и для уменьшения связности кода и предотвращения зацикленности включений. Подробнее можно почитать здесь: http://programming-lang.com/ru/comp_programming/satter/0/j39.html.
S>Для классов не применимо extern а для функций, к примеру, применимо. Эта запись class QLocalServer; — эквивалент extern-а для функций?
Тут нужно бы начать с того, что немного разобраться с понятиями: есть объявления (declarations), а есть определения (definitions). Очень часто объявление одновременно является и определением. extern же — это разновидность спецификации связывания (linkage). External linkage означает, что имя доступно в разных единицах трансляции и обрабатывается линковщиком. Фунцкции, классы и неконстантные объекты, объявленные в области видимости пространств имен, по умолчанию имеют внешнее связывание (external linkage), поэтому от явной спецификации extern мало пользы и ее чаще всего опускают.
Здравствуйте, sergii.p, Вы писали:
SP>Но не всё однозначно конечно. При объявлении несколько сложнее рефакторинг (заменили class на struct, поменяли имя и т. д.). Да и вообще это выглядит как костыль (а на самом деле таким и является).
Можно создавать особенные заголовочные файлы, которые состоят только из предварительных объявлений. Включение таких файлов вполне безобидно, но в некоторых случаях может избавить от общирных изменений по коду после рефакторингов.
--
Убегая от C++, ты убегаешь от себя (с) Shmj++
Re: Линковка - как понять C#-овскими мозгами (на примере)?
S>Здесь есть include а есть просто декларация class QLocalServer. А ведь можно сделать и #include <QLocalServer> и тоже будет работать.
S>В чем разница и как лучше — включать или просто объявлять?
Разница в том, что файл QLocalServer здоровый и парсить его долго и сложно. При этом для объявления указателя на этот класс тебе этот файл не нужен. Тебе нужно только сообщить компилятору о самом факте существования такого класса. Поэтому в целом оба варианта будут работать, но вариант без include будет компилироваться быстрей. При этом, конечно, в файле с реализацией, где ты будешь вызывать методы этого класса, тебе уже нужен нормальный include.
По сути это костыль для кривого C++ в котором нет модулей. В нормальных языках такой нужды нет.
Ещё такой подход может использоваться в рекурсивных структурах. Когда тебе надо объявить указатель на структуру, которая объявляется поздней.
S>Для классов не применимо extern а для функций, к примеру, применимо. Эта запись class QLocalServer; — эквивалент extern-а для функций?
extern используется для глобальных переменных. Для функций extern использовать смысла не имеет, они всегда extern. Просто напиши определение функции без тела. Я не думаю, что есть смысл проводить аналогию тут, мне кажется это разные вещи.
Re[2]: Линковка - как понять C#-овскими мозгами (на примере)?
Здравствуйте, LaptevVV, Вы писали:
LVV>Линковка — это когда работает линкер.
Валерий Викторович, компановщик или редактор связей
В присутствии студентов тоже "литнкер"?
Re[3]: Линковка - как понять C#-овскими мозгами (на примере)?
LVV>>Линковка — это когда работает линкер. _>Валерий Викторович, компановщик или редактор связей _>В присутствии студентов тоже "литнкер"?
Я им про все три термина рассказываю.
И схему алгоритма компоновки (статической) тоже рассказываю
Хочешь быть счастливым — будь им!
Без булдырабыз!!!
Re[2]: Линковка - как понять C#-овскими мозгами (на примере)?
Здравствуйте, sergii.p, Вы писали:
SP>Но не всё однозначно конечно. При объявлении несколько сложнее рефакторинг (заменили structна struct, поменяли имя и т. д.).
В чем проблема с заменой class/struct?
Переименование и forward declaration для IDE сейчас не проблема.
SP>Да и вообще это выглядит как костыль (а на самом деле таким и является).
Это логичное решение при разделении на cpp/h.
Re: Линковка - как понять C#-овскими мозгами (на примере)?
Не надо так делать. Это они от какого-то большого отчаянья.
S>Здесь есть include а есть просто декларация class QLocalServer. А ведь можно сделать и #include <QLocalServer> и тоже будет работать.
#include принесет с собой декларацию класса, его методов и всё такое.
Просто объявление класса сообщит компилятору, "слушай, компилятор, вот есть такой класс XXX. ты там особо не ругайся, если он будет упомянут в коде". Это называется, forward declaration.
Такое иногда бывает надо, если в пределах .h-ника не получается так расположить декларации, чтобы не было ссылок вперед. Например, из-за циклической зависимости между декларациями. Но делающий так должен контролировать и forward declaration, и настоящее объявление.
Если же ты таким способом ты будешь ссылаться на какие-то внешние, не твои, классы, рано или поздно твои декларации расползутся с настоящими.
S>В чем разница и как лучше — включать или просто объявлять?
Включать.
S>Для классов не применимо extern а для функций, к примеру, применимо. Эта запись class QLocalServer; — эквивалент extern-а для функций?
extern нужен только для переменных. Для функций он ничего нового компилятору не сообщает.