Как вы относитесь к #include посреди cpp?
От: XJess  
Дата: 05.10.10 15:17
Оценка:
Привет всем!
Собственно, сабж. Я вот недавно наткнулась в чужом коде на такое. Хотелось бы узнать, зачем человек мог так сделать? Это типа, чтобы включалось как можно ближе к месту использования чего-то из этого хедера?

Какие грабли могут быть от такого?

Кстати, по правилам хорошего тона все #include должны ведь быть в начале?
Re: Как вы относитесь к #include посреди cpp?
От: dilmah США  
Дата: 05.10.10 15:22
Оценка:
http://www.drdobbs.com/184401387;jsessionid=WFKIFSHRP1HW5QE1GHPSKHWATMY32JVN

http://en.wikipedia.org/wiki/C_preprocessor#X-Macros
Re[2]: Как вы относитесь к #include посреди cpp?
От: okman Беларусь https://searchinform.ru/
Дата: 05.10.10 19:37
Оценка:
Здравствуйте, dilmah, Вы писали:

D>http://www.drdobbs.com/184401387;jsessionid=WFKIFSHRP1HW5QE1GHPSKHWATMY32JVN

D>http://en.wikipedia.org/wiki/C_preprocessor#X-Macros

Интересно...
Хотя впечатление такое, как если регулярные выражения триграфами записывать.
Re: Как вы относитесь к #include посреди cpp?
От: jazzer Россия Skype: enerjazzer
Дата: 06.10.10 00:26
Оценка: +1
Здравствуйте, XJess, Вы писали:

XJ>Привет всем!

XJ>Собственно, сабж. Я вот недавно наткнулась в чужом коде на такое. Хотелось бы узнать, зачем человек мог так сделать? Это типа, чтобы включалось как можно ближе к месту использования чего-то из этого хедера?

XJ>Какие грабли могут быть от такого?


XJ>Кстати, по правилам хорошего тона все #include должны ведь быть в начале?


если не используется всякая препроцессорная магия — все инклуды должны быть в начале, чтобы вносить зависимости.
А если используется — тут возможны моря вариантов, хотя я лично предпочитаю Boost.Preprocessor и прибегаю к таким вот включениям огрызков файлов в середине только если огрызки слишком большие.
jazzer (Skype: enerjazzer) Ночная тема для RSDN
Автор: jazzer
Дата: 26.11.09

You will always get what you always got
  If you always do  what you always did
Re: Как вы относитесь к #include посреди cpp?
От: Sni4ok  
Дата: 06.10.10 12:22
Оценка: 1 (1) -3
Здравствуйте, XJess, Вы писали:

XJ>Собственно, сабж. Я вот недавно наткнулась в чужом коде на такое. Хотелось бы узнать, зачем человек мог так сделать? Это типа, чтобы включалось как можно ближе к месту использования чего-то из этого хедера?


если я использую что-то прямо-тут, то и разумно включить тутже- чтобы не мотать на начало файла.

XJ>Какие грабли могут быть от такого?


гипотетические можно придумать какие-то, но эти грабли будут исключительно субьективными для обьекта который их придумает.

XJ>Кстати, по правилам хорошего тона все #include должны ведь быть в начале?


нет, с чего вдруг?
Re: Как вы относитесь к #include посреди cpp?
От: _b_l_  
Дата: 06.10.10 12:33
Оценка:
Здравствуйте, XJess, Вы писали:

XJ>Привет всем!

XJ>Собственно, сабж. Я вот недавно наткнулась в чужом коде на такое. Хотелось бы узнать, зачем человек мог так сделать? Это типа, чтобы включалось как можно ближе к месту использования чего-то из этого хедера?

XJ>Какие грабли могут быть от такого?


XJ>Кстати, по правилам хорошего тона все #include должны ведь быть в начале?


Когда все include собраны в одном месте, легче найти это место и увидеть все зависимости. Грабли могут быть если, например, кто-нибудь захочет добавить using namespace blah-blah и не заметит, что где-то ниже по коду стоят директивы include. Если человек делает это, потому что ему лень прокручивать файл в начало и обратно, научите его комбинациям "Ctrl+Home" и "Ctrl+-" (для MSVS).
Re: Как вы относитесь к #include посреди cpp?
От: TimurSPB Интернет  
Дата: 06.10.10 12:35
Оценка: :)
Не смотря на все разумные и не очень доводы "за", руки по отрубать за такое шаманство.
Make flame.politics Great Again!
Re: Как вы относитесь к #include посреди cpp?
От: Stanislav V. Zudin Россия  
Дата: 06.10.10 13:08
Оценка:
Здравствуйте, XJess, Вы писали:

XJ>Собственно, сабж. Я вот недавно наткнулась в чужом коде на такое. Хотелось бы узнать, зачем человек мог так сделать? Это типа, чтобы включалось как можно ближе к месту использования чего-то из этого хедера?


XJ>Какие грабли могут быть от такого?


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

Например, чтобы вынести реализацию inline функций в отдельный файл. У этого файла не будет scope guard'ов, расширение будет другим (например, .inl) и подключаться он будет после объявления класса.

Причина — в нескольких файлах небольшого размера легче ориентироваться, чем в одном километровом. А компилятору пофигу.
_____________________
С уважением,
Stanislav V. Zudin
Re: Как вы относитесь к #include посреди cpp?
От: Chorkov Россия  
Дата: 06.10.10 16:21
Оценка: 6 (1) +3
Здравствуйте, XJess, Вы писали:

XJ>Привет всем!

XJ>Собственно, сабж. Я вот недавно наткнулась в чужом коде на такое. Хотелось бы узнать, зачем человек мог так сделать? Это типа, чтобы включалось как можно ближе к месту использования чего-то из этого хедера?

XJ>Какие грабли могут быть от такого?


XJ>Кстати, по правилам хорошего тона все #include должны ведь быть в начале?


Помимо X-Macros, упомянутых dilmah, я знаю две идиомы использующие include в середине файла:

1) Вставка пакета данных:
int magic_numbers [] = {
#include "magic_numbers.txt" 
// файл содержит числа через запятую. Как правило, генерируемых.
};



2) Отделение декларации от реализации в случае развесистых шаблонных классов:
// A.h
#ifndef A_H_INCLUDED
#define A_H_INCLUDED

template<class A, class B, class C>
class N
{
  void f1();
  void f2();
  void f3();
...
}
#include "A.impl"
#endif

// A.impl, используется в роли A.cpp 
#ifndef A_H_INCLUDED
#error you must include "A.h", but not "A.impl"
#endif
template<class A, class B, class C>
void N::f1()
{
  ...
}
...
Re: Как вы относитесь к #include посреди cpp?
От: bkat  
Дата: 06.10.10 19:02
Оценка:
Здравствуйте, XJess, Вы писали:

XJ>Привет всем!

XJ>Собственно, сабж. Я вот недавно наткнулась в чужом коде на такое. Хотелось бы узнать, зачем человек мог так сделать?

Обычно так не делают.
Но раз человек так сделал, то у него наверное были причины.
Попробуй спроси у него лично.
Или он физически не доступен?
Re: Как вы относитесь к #include посреди cpp?
От: Pzz Россия https://github.com/alexpevzner
Дата: 06.10.10 20:06
Оценка:
Здравствуйте, XJess, Вы писали:

XJ>Собственно, сабж. Я вот недавно наткнулась в чужом коде на такое. Хотелось бы узнать, зачем человек мог так сделать? Это типа, чтобы включалось как можно ближе к месту использования чего-то из этого хедера?


Иногда бывает нужно что-нибудь по-быстренькому попробовать, не хватает какого-нибудь #include, и втыкаешь его прям по месту использования (чтобы к верху файла не тянуться). Потом, если изменение останется в коде, можно случайно забыть перенести #include в положенное для него место.

XJ>Какие грабли могут быть от такого?


Если этим злоупотреблять, можно приобрести репутацию быдлокодера

Кроме того, если у вас случайно возникнет конфликт между вашим кодом и хидером (например, вы случайно использовали имя макроса или функции, которую использует этот хидер), то если #include стоит в середине файла, ошибка может вылезти не в вашем коде, а в хидере, и вы охренеете от разглядывания его

XJ>Кстати, по правилам хорошего тона все #include должны ведь быть в начале?


Да. Язык это не энфорсит, но принято ставить #include в начале.
Re: Как вы относитесь к #include посреди cpp?
От: MasterZiv СССР  
Дата: 07.10.10 05:31
Оценка:
XJess wrote:

> Собственно, сабж.


Как к крайней степени раздолбайству.

> Хотелось бы узнать, зачем человек мог так сделать?


Дебил. Лентяй.
Что блин вверх исходник лень прокрутить, а потом назад ?

Это типа, чтобы
> включалось как можно ближе к месту использования чего-то из этого хедера?

нет, это типа просто лень. Либо лень прокрутить исходник туда-сюда,
либо лень разбить исходный модуль на 2.

> Какие грабли могут быть от такого?


Ну у нас тупо не собирается часть кода в дебаге из-за этого.
MSVC, MFC, -D_DEBUG

Если подробности интересуют, в MS-ориентированном коде
много где (то есть везде) .cpp начинаются такой штукой:


#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif


Все заголовки НЕ РАСЧИТАНЫ на то, что DEBUG_NEW определён.
И должны идти ДО этого.
Весь код реализации расчитан на то, что DEBUG_NEW определён.

Хотя конечно в общем случае проблемы не существует, она
проявляется только в конкретике.
Posted via RSDN NNTP Server 2.1 beta
Re[2]: Как вы относитесь к #include посреди cpp?
От: MasterZiv СССР  
Дата: 07.10.10 05:37
Оценка:
Sni4ok wrote:

> если я использую что-то прямо-тут, то и разумно включить тутже- чтобы не

> мотать на начало файла.

Аааа, вот они, повылазили.
Лентяи и раздолбаи.
Моё мнение по этому поводу -- лень мотать -- иди работай грузчиком.

> XJ>Какие грабли могут быть от такого?

>
> гипотетические можно придумать какие-то, но эти грабли будут
> исключительно субьективными для обьекта который их придумает.

см. мой пост в теме.

> XJ>Кстати, по правилам хорошего тона все #include должны ведь быть в начале?

>
> нет, с чего вдруг?

С того, чтобы открыв исходник, сразу видеть от чего он зависит.
Заметь, это не правила С++ или С, а хорошего тона. В общем это
правила типа "не делай другим того, чего ты не хотел бы чтобы
сделали себе". Оноже "не гадь где еш".
Posted via RSDN NNTP Server 2.1 beta
Re[3]: Как вы относитесь к #include посреди cpp?
От: frogkiller Россия  
Дата: 07.10.10 06:53
Оценка:
Здравствуйте, MasterZiv, Вы писали:

>> если я использую что-то прямо-тут, то и разумно включить тутже- чтобы не

>> мотать на начало файла.

MZ>Аааа, вот они, повылазили.

MZ>Лентяи и раздолбаи.
MZ>Моё мнение по этому поводу -- лень мотать -- иди работай грузчиком.

Лень — двигатель прогресса и враг копипасты
Курица — это инструмент, с помощью которого одно яйцо производит другие.
Re[3]: Как вы относитесь к #include посреди cpp?
От: Pzz Россия https://github.com/alexpevzner
Дата: 07.10.10 13:40
Оценка:
Здравствуйте, MasterZiv, Вы писали:

MZ>С того, чтобы открыв исходник, сразу видеть от чего он зависит.

MZ>Заметь, это не правила С++ или С, а хорошего тона. В общем это
MZ>правила типа "не делай другим того, чего ты не хотел бы чтобы
MZ>сделали себе". Оноже "не гадь где еш".

"Ешь" пишется с мягким знаком на конце. И не делать этого — все равно, как #include посреди файла писать
Re[4]: Как вы относитесь к #include посреди cpp?
От: dilmah США  
Дата: 07.10.10 13:46
Оценка:
MZ>>Оноже "не гадь где еш".

Pzz>"Ешь" пишется с мягким знаком на конце. И не делать этого — все равно, как #include посреди файла писать


имхо он имел в виду: "не гад, где еж" -- то есть что рядом с ежами нечего делать гадам (змеям и прочим лягушкам) -- едят ежи их.
Re: Как вы относитесь к #include посреди cpp?
От: Smooky Россия  
Дата: 07.10.10 13:59
Оценка:
В библиотеках на С можно часто встретить, также в исходниках FreeBSD часто встречал:

// somedata.inc
0x87677457 0x45638767
0x45763565 0x14653575
... // и т.д.

// someheader.h
const int v[256] = {
#include somedata.inc
};
Только Путин, и никого кроме Путина! О Великий и Могучий Путин — царь на веки веков, навсегда!
Смотрю только Соловьева и Михеева, для меня это самые авторитетные эксперты.
КРЫМ НАШ! СКОРО И ВСЯ УКРАИНА БУДЕТ НАШЕЙ!
Re[2]: Как вы относитесь к #include посреди cpp?
От: dilmah США  
Дата: 07.10.10 14:02
Оценка:
S>В библиотеках на С можно часто встретить, также в исходниках FreeBSD часто встречал:

S>// somedata.inc

S>0x87677457 0x45638767
S>0x45763565 0x14653575
S>... // и т.д.

S>// someheader.h

S>const int v[256] = {
S>#include somedata.inc
S>};

это особенно оправданно, когда такой .inc файл автогенерируется скриптом.
Re[2]: Как вы относитесь к #include посреди cpp?
От: Smooky Россия  
Дата: 07.10.10 14:02
Оценка:
сорри, чтото с форматингом глюки


// somedata.inc
0x87677457, 0x45638767,
0x45763565, 0x14653575,
... // и т.д.

// someheader.h
const int v[256] = {
#include somedata.inc
};
Только Путин, и никого кроме Путина! О Великий и Могучий Путин — царь на веки веков, навсегда!
Смотрю только Соловьева и Михеева, для меня это самые авторитетные эксперты.
КРЫМ НАШ! СКОРО И ВСЯ УКРАИНА БУДЕТ НАШЕЙ!
Re[3]: Как вы относитесь к #include посреди cpp?
От: Sni4ok  
Дата: 07.10.10 23:32
Оценка: -1
Здравствуйте, MasterZiv, Вы писали:

MZ>Аааа, вот они, повылазили.

MZ>Лентяи и раздолбаи.
MZ>Моё мнение по этому поводу -- лень мотать -- иди работай грузчиком.

а я безработный, и да я ленивый.

>> XJ>Кстати, по правилам хорошего тона все #include должны ведь быть в начале?

>>
>> нет, с чего вдруг?

MZ>С того, чтобы открыв исходник, сразу видеть от чего он зависит.


вот есть у меня такой код

#ifndef WIN32
#include <signal.h>
void on_signal(int sign){
}
#endif
int main(int argc, char ** argv)
{
#ifndef WIN32
    signal(SIGHUP, &on_signal);
#endif

всё просто и понятно- и в одном месте, и помоему совсем твердолобым нужно быть, чтобы #include <signal.h> выносить в начало файла.

MZ>Заметь, это не правила С++ или С, а хорошего тона. В общем это

MZ>правила типа "не делай другим того, чего ты не хотел бы чтобы

вы вбили себе что-то в голову(типа goto плохо, инклуды посреди файла плохо и т.п), и свято этому верите- как правило это от скудоумия(легче вбить барану в голову- "не убий", "не укради" чем заставить думать и научить оценивать риски и возможную выгоду от своих потонциальных действий для себя и социума).
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.