> В таком случае расскажи как должно быть и как сделать по-людски.
> Мне-то казалось, что всё нормально - из объектника взять
> скомпилированный код, определить смещения, бухнуть в ехе и всё (может
> это связано с использованием precompiled headers?).
Ну, ВВ тебе уже всё объяснил. От себя добавлю следующее.
1. Заголовки - это (в частности) средство декларации интерфейсов. В простом
plain-C иначе декларировать интерфейс было просто не возможно. C++ эту
возможность унаследовал в силу простоты и удобства. По мне, так методы
декларации интерфейсов Turbo/Borland Pascal и Modula-2 куда как более
неудобны, а в Delphi вообще доведены до маразматической сложности.
2. Так как заголовки описывают интерфейс чего-то там (например, stdio.h
описывает интерфейс стандартной подсистемы ввода-вывода в plain-C, vector -
интерфейс класса vector<> в C++, locale - интерфейс средств локализации и
поддержки национально- и культурно- зависимых характеристик операционного
окружения программы, итд), то реализации в них быть не должно. Исключение
делается только для информации, без которой невозможно обойтись в принципе -
это подставляемые (inline) функции и шаблоны, так как они нужны прямо здесь
и сейчас. И то для шаблонов - это скорее от лени поставщиков средств
разработки, чем по необходимости. Export templates им видите ли напряжно
поддержать.
3. Любое что-нибудь external linkage, появляющееся в заголовке (а
подставляемые функции и шаблоны как раз в большинстве случаев к ним могут не
относиться), это потенциальный источник проблем при сборке, как ты уже
убедился и как это прояснил ВВ. НЕ ДОЛЖНО быть реализации интерфесов в
заголовках. Не для этого они предназначены. Короче, если в процессе
компиляции чисто заголовка компилятор порождает ненулевой объём объектного
кода (не путай с нулевым размером объектного файла), то этот заголовок
неправильный. Реализация должна быть в отдельной единице компиляции. Даже
если она состоит всего лишь из одного определения `int i=0;` Исключения
"разрешены" стандартом только для константных r-value, например `const int
i=0`. Но уже для `const coolClass myClass(someExpression)` это будет
неверно, ибо это l-value.
4. Имеет смысл создавать заголовки не только для экономии размера кода. Даже
если заголовок будет использован в проекте всего один раз, всё равно он
решает свою задачу по декларации интерфейса. Действительно, ведь новый класс
программист может написать даже в том случае, если ему понадобится всего
один его экземпляр. Главное, что ему понадобился чёрный ящик, и он этим
классом его создал. Впрочем, могут быть и другие причины.
5. Заголовки не имеют самостоятельного применения. Окромя быть прочитанными
программистом, "по диагонали", возможно. Заголовки включаются в единицу
компиляции, как составные её части, снабжая компилятор объявлениями.
Реализация всего этого потом и позже подлинкуется при сборке.
Ещё вопросы?
--
С уважением, boroda
mailto:boroden***@s*****.ru
Номер выпуска : 4521
Возраст листа : 614 (дней)
Количество подписчиков : 524
Адрес в архиве : http://subscribe.ru/archive/comp.soft.prog.prog/msg/374490
Получить правила : mailto:comp.soft.prog.prog-rules@subscribe.ru
Формат "дайджест" : mailto:comp.soft.prog.prog-digest@subscribe.ru
Формат "каждое письмо" : mailto:comp.soft.prog.prog-normal@subscribe.ru
Формат "читать с веба" : mailto:comp.soft.prog.prog-webonly@subscribe.ru