LINUX.ORG.RU

[c/c++] хидеры vs forward declarations


0

0

А вот что предпочитает уважаемый All:

#include "blabla.h"
или
class blabla;
в больших проектах с кучей хедеров? Против первого вопроса вроде-бы говорит путаница и рекурсивный инклюд, против второго - возложение миссии подтирать за программистом целиком на линкер и пляски с анрезолвед екстерналс. По-мне, так лучше первый подход, ибо парсеры в некоторых IDE (не будем показывать пальцем) включают автокомплит только тогда, когда в области видимости есть декларация класса. Дискач.

★★★★★

>возложение миссии подтирать за программистом целиком на линкер и пляски с анрезолвед екстерналс.

щито?

Предпочитаю второй, если используются указатели и ссылки данного класса.

alex_custov ★★★★★
()

> Против первого вопроса вроде-бы говорит путаница и рекурсивный инклюд

и возрастающее время билда

> пляски с анрезолвед екстерналс


o_O

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

>щито?

ну если в первом случае компилятор ругнется на неправильный метод и подскажет варианты, то во втором линкер тупо его не найдет и выдаст анрезолвед символ, и ищи где там ошибка.

lester_dev ★★★★★
() автор топика

я не очень хорошо знаю C\C++, но сабж для меня звучит также как и: "что лучше, переменные или функции?"

я нихрена не понял, в чем суть проблемы?

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

>и возрастающее время билда

есть мнение, что pch спасет отца русской интеллигенции, но я не уверен

lester_dev ★★★★★
() автор топика

> ...в больших проектах с кучей хедеров?

Эта фразой ты ответил на свои вопросы самостоятельно. А еще есть прекомпиленные хидеры.

> ...возложение миссии подтирать за программистом целиком на линкер и пляски с анрезолвед екстерналс


Вендузятник?

mannaz
()

Из отвечающих «второй вариант» сам хоть кто-то пробовал? Incomplete types могут быть использованы только в очень ограниченном числе мест. Нельзя сделать даже так:

class blabla;

int main()
{
  blabla b;
}
bvvv
()

Второй, разумеется, даже без вариантов. Проблемы IDE - только проблемы IDE, у меня в vim комплишн работает независимо от включение заголовочных файлов.

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

Ага, а еще можно забыть точку с запятой после forward declaration'а поставить.

mannaz
()
Ответ на: комментарий от lester_dev

ты имеешь ввиду если писать class bla; в .cpp файле? Это ж вообще. Я имею ввиду, что

1) если в .h файле используется * или & от класса bla, то включать "bla.h" не нужно, достаточно "class bla;" в хедере того класса где используентся bla, а "bla.h" включаем в .cpp. Это сокращает время компиляции нескольких tu.

2) если в .h или .cpp файле используется объект класса bla, либо другой код, требующий по стандарту полное описани класса bla, то тогда да, в хедере включаем "bla.h".

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

Я не об этом. Не понял, каким образом при использовании способа №2 вызов "неправильного метода" может привести к ошибке "анрезолвед екстерналс" на этапе линковки.

mannaz
()
Ответ на: комментарий от lester_dev

> есть мнение, что pch спасет отца русской интеллигенции, но я не уверен

есть мнение, что если пихать все в pch - то это только увеличит время билда при мелких изменениях

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

> из отвечающих "второй вариант" сам хоть кто-то пробовал?

facepalm.xbm

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

Второе, ибо нефиг в описании одного класса слишком много знать о других. При втором способе вообще можно разные хедеры подключать, определяющие этот класс. И ещё при втором способе меньше шансов бинарную совместимость сломать

Gorthauer ★★★★★
()

> По-мне, так лучше первый подход
> lester_dev (*) (18.11.2009 15:19:14)


> второй вариант

> lester (*) (18.11.2009 15:34:58)


Так вы чё, не виртуалы друг друга?

LamerOk ★★★★★
()

в таких вопросах предпочтениям не место

jtootf ★★★★★
()

Однозначно, forward declarations там, где их достаточно. Просто потому, что от этого одни преимущества. «Некоторые IDE» идут лесом.

const86 ★★★★★
()

Первое. Никакой путаницы и проблем с рекурсивностью не испытываю.

Deleted
()
Ответ на: комментарий от lester

>> Так вы чё, не виртуалы друг друга?

просто хорошо маскируемся

э-хе-хе-хе

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

Никакой путаницы и проблем с рекурсивностью не испытываю.

Проблема не столько с рекурсивностью, сколько с зацикливанием:

$ cat z.cxx 
#include "x.hxx"
X x;

$ cat x.hxx 
#ifndef __X__
#define __X__
#include "y.hxx"
class X {
	Y *y;
};
#endif

$ cat y.hxx 
#ifndef __Y__
#define __Y__
#include "x.hxx"
class Y {
	X *x;
};
#endif

Ну и скорость компиляции повыше, если меньше хедеров включать.

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

Ну, не знаю… особенно огромных программ у меня, правда, не было.

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

Саттер так делать не рекоммендует, и советует обучить IDE ставить в include guard какой-нибудь UUID. Кроме того, он утверждает что минимизацией зависимостей при помощи pimpl и forward declarations он уменьшил время сборки ряда своих проектов в два раза, что для такого языка как С++ конечно важно.

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