LINUX.ORG.RU

[namespace] вопрос морали и хорошего тона.


0

0

Как я понял, нельзя объявить прототип пространства имён в хидере, а реализацию в исходном файле. Является ли нормальным тоном писать всё прямо в заголовочном файле, а потом включать его куда нужно? Или как-то иначе? А может быть я нуб и прототип можно объявить?


Ответ на: комментарий от placement_new

Да, меня тоже это сконфузило.
Думаю ТС говорит просто о использовании всякий .hpp и вообще .h с кодом внутри. Я могу ответить просто - быдлокод. Правда в некоторых своих проектах я разрешал такое для нескольких небольших классов(по сути были немного модифицированные контейнеры, пизменений не много, посему разрешил).

tia ()

>Является ли нормальным тоном писать всё прямо в заголовочном файле, а потом включать его куда нужно?

Нормальным тоном является написание максимума из возможного в .cxx файле.

Absurd ★★★ ()

Как я понял, нельзя объявить прототип пространства имён в хидере, а реализацию в исходном файле.

Так что ли?

// x.hxx
namespace bla {
	class X {
		void f();
	};
};
// x.cxx
#include "x.hxx"
void bla::X::f() {
}

const86 ★★★★★ ()
Ответ на: комментарий от LamerOk

>Сегодня - твоя очередь!

О'кей, одноклашка. ;)

anonymous ()
Ответ на: комментарий от tia

> я разрешал такое для нескольких небольших классов

А как быть с шаблонами?

anonymous ()
Ответ на: комментарий от tia

> Я могу ответить просто - быдлокод. Правда в некоторых своих проектах я разрешал такое для нескольких небольших классов(по сути были немного модифицированные контейнеры, пизменений не много, посему разрешил).

Реализацию некоторых вещей бывает сложно сделать исключительно в cpp-файле. Например inline-функции, шаблоны.

m0rph ★★★★★ ()
Ответ на: комментарий от LamerOk

Определения inline-функции во всех единицах трансляции должны совпадать. Поэтому существует подход, при котором объявление и определение inline-фунции находится в заголовочном файле. Кроме того, у вас может отсутствовать непосредственно исходный текст модуля. Т.е. вместо cpp-файла есть всего-лишь объектный модуль и его заголовочный файл с объявлениями. В таком случае, inline-функции могут быть определены только в этом заголовочном файле. То же самое касается и шаблонов.

m0rph ★★★★★ ()
Ответ на: комментарий от m0rph

Нуу, НЕ-inline шаблонных функций это касается просто потому что компилятор не знает какие экземпляры шаблона где пригодятся, и, компилируя .cxx с шаблоном, он скомпилит только те что нужны в этом одном конкретном .cxx.
В результате линковка обрывается с unresolved ошибкой.

l5k ()
Ответ на: комментарий от m0rph

>Определения inline-функции во всех единицах трансляции должны совпадать.

Стандарт С++ 3.2/3

Every program shall contain exactly one definition of every non-inline function or object that is used in that program; no diagnostic required. The definition can appear explicitly in the program, it can be found in the standard or a user-defined library, or (when appropriate) it is implicitly defined (see 12.1, 12.4 and 12.8). An inline function shall be defined in every translation unit in which it is used.

В каждой единице трансляции функции inline должны обязательно определяться и при этом могут быть разными у разных единиц трансляции.

anonymous ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.