LINUX.ORG.RU

include «other_code.cpp» посреди кода

 , оформление кода


0

2

Что бы вы подумали, если бы читая код, написанный другим разработчиком, увидели следующее:

#include <*.h> куча инклудов, как всегда
...
blablabla
// классы-функции, вся фигня

#include <other_code.cpp>

// и дальше тоже какие-то куски кода

?

Причем в other_code.cpp нет никаких инклудов, это просто кусок кода вынесен отдельно.

В связи с этим, кстати, второй вопрос: как грамотно вынести кусок громоздкого файла в другой файл, если хочется просто разделить один сиплюсплюсный исходник на два? Ну, например, допустим что есть класс, надо его реализацию сделать не в одном файле, а в двух, часть функций-членов в одном файле, часть — в другом. Эти файлы ведь нельзя будет собирать по очереди, так как в одном не будет одной половины методов, в другом — другой.

P. S.: Модераторам: первый вопрос все-таки нетехнический, поэтому поместил в Talks. Если ошибся — перенесите в правильное место.

Перемещено mono из talks

★★★

Последнее исправление: Kiborg (всего исправлений: 1)

class A {
    int a;
    public:
    void method();
};

int
main(int argc, char *argv[])
{
    A a;
    return 0;
}

Не наводит на мысль?

anonymous
()

допустим что есть класс, надо его реализацию сделать не в одном файле, а в двух, часть функций-членов в одном файле, часть — в другом. Эти файлы ведь нельзя будет собирать по очереди, так как в одном не будет одной половины методов, в другом — другой.

Интересно, а ты хоть попробовал это сделать?

tailgunner ★★★★★
()

Как и в сишке, хидер класса только объявляет форварды, а методы класса это всего лишь замангленные функции. Если оба твоих сорца заинклудят один и тот же хидер, но реализуют разные части набора методов, то своя часть разрезолвится как местная, а не своя как внешняя. Внешние зависимости разрезолвятся при линковке.

anonymous
()

Реализацию класса можно хоть по ста файлам раскидать. А такое оформление не очень хорошее, но имеет право на жизнь при использовании автогенерированного кода. Например таблица с обработчиками команд может быть вынесена в отдельный файл и создаваться при сборке скриптом духа:

echo "static command commands[] = {"
for x in *; do
  if [ -d "$x" ]; then
    echo "{ \"$x\", &do_$x },"
  fi
done
echo "NULL};"

Класс или структура command определяется раньше, глобально определенной ее делать нет смысла.

rymis ★★
()

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

anonymous
()

Обычно .cpp инклюдят ради шаблонов либо инлайновых функций которые в них находятся. Иначе будут ошибки типа type redefinition.

Absurd ★★★
()

В первую очередь я бы подумал, что other_code.inc содержит развёртывания макроса, вроде

error(unexpected_token, true, false, "expected %1, got %2"),
error(undeclarated_id, true, true, "%1 is not declarated in this scope"),
// etc...
Если предположение не подтвердится или если файл имеет расширение cpp вместо inc или inl, значит, предыдущий разработчик был ненормальным.

quiet_readonly ★★★★
()

Что бы вы подумали, если бы читая код, написанный другим разработчиком, увидели следующее:

Что кто-то не умеет пользоваться макросами. Как вариант - вставляется сгенерённый машиной код, но это всяко плохая практика.

В связи с этим, кстати, второй вопрос: как грамотно вынести кусок громоздкого файла в другой файл, если хочется просто разделить один сиплюсплюсный исходник на два? Ну, например, допустим что есть класс, надо его реализацию сделать не в одном файле, а в двух, часть функций-членов в одном файле, часть — в другом.

Не надо этого делать. Не поверю, что класс может быть НАСТОЛЬКО огромен, чтобы понадобилось размещать его в двух файлах. Если так, то лучше будет разбить сам класс.

auto12884839
()

как грамотно вынести кусок громоздкого файла в другой файл, если хочется просто разделить один сиплюсплюсный исходник на два? Ну, например, допустим что есть класс, надо его реализацию сделать не в одном файле, а в двух, часть функций-членов в одном файле, часть — в другом.

Разносить разные сущности по разным классам, а классы по разным файлам.

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

А, то есть можно так разнести класс? Отлично, спасибо.

Я вообще ближе к сям, этот вопрос мне был интересен с теоретической точки зрения.

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

Отвечу вам и большинству остальных: в том подключенном .cpp был написан код реализации пары функций. Никаких макросов, автогенерации и т. п. Просто взяли часть функций и перенесли в другой файл, а этот другой файл заинклудили.

Не поверю, что класс может быть НАСТОЛЬКО огромен

Ну, меня интересовал вопрос только с теоретической точки зрения. На практике, вероятно, действительно

лучше будет разбить сам класс

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

Ага, спасибо за информацию. Что-то я затупил с этим вопросом, это же действительно работа линковщика.

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

Я подумал примерно то же самое.

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

Эти файлы ведь нельзя будет собирать по очереди, так как в одном не будет одной половины методов, в другом — другой

Зато в хидере все методы будут. Инклудишь хидер в оба cpp файла и будет тебе счастье.

trex6 ★★★★★
()
Последнее исправление: trex6 (всего исправлений: 1)

В общем случае это нормально, например, other_code может быть просто сгенерирован чем-нибудь уровнем по-выше плюсов.

yoghurt ★★★★★
()

Я подумал бы, что разработчик чудак. На букву «М».

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

Можно. И что, что нету? Компилятору вообще плевать, определена какая-то функция, или только объявлена. Линкеру не плевать, но линкер понятия не имеет, что функции относятся к одному классу.

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

обычно в гуях есть куча безмозглого копипастнутого/автогенерящегося кода, в середину которого втыкается что-то осмысленное. Вот это «осмысленное» стоит выделить в отдельный файл, а gui-фреймворк пусть об этом лучше не знает и продолжает генерить портянки в основной файл. В C# для этого сделали partial class definition: http://msdn.microsoft.com/ru-ru/library/wa80x488.aspx

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

Ужасно, никогда с таким не сталкивался. Все генерилки, которые я писал или видел, генерили и *.cpp, и *.h. Вставлять cpp внутрь cpp — жесть.

unfo ★★★★★
()

Я почти так делал. На простом C вектор инициализации для массива структур. В основном файле:

struct xxx[] = {
#include "some.c"
}

ziemin ★★
()

Это говнокод, хотя таким методом некоторые пользуются в разработке с Qt.

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

в том подключенном .cpp был написан код реализации пары функций

Дай угадаю, там присутствовало слово «inline», да?

DELIRIUM ☆☆☆☆☆
()
Ответ на: комментарий от auto12884839

Не поверю, что класс может быть НАСТОЛЬКО огромен, чтобы понадобилось размещать его в двух файлах.

Видал god-класс на 20к строк реализации + 8к строк хедера. Да, от него еще наследовался класс с еще 15к/4к :)

Pavval ★★★★★
()

Ну, например, допустим что есть класс, надо его реализацию сделать не в одном файле, а в двух, часть функций-членов в одном файле, часть — в другом.

Если у вас класс настолько огромен, что для его реализации нужно несколько cpp-файлов, то пора начать думать головой.

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

Обычно это всё значит, что пора выделять новые сущности.

+1

andreyu ★★★★★
()

В чём вообще прикол, делать #include<xxx.CPP>, тем более посреди кода O_o

xterro ★★★★★
()

Что бы вы подумали, если бы читая код, написанный другим разработчиком

Ооо, я так тоже делал. :)

В связи с этим, кстати, второй вопрос: как грамотно вынести кусок громоздкого файла в другой файл

Не вижу проблемы. Берешь и делишь код на два файла.

Эти файлы ведь нельзя будет собирать по очереди

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

pathfinder ★★★★
()
Последнее исправление: pathfinder (всего исправлений: 1)

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

Чего это вдруг нельзя? Очень даже можно. На выходе будет два объектника с неразрешёнными зависимостями, которые потом благополучно хавает компоновщик. Ты можешь следать объявление класса в одном .h, а количество .cpp - хоть по файлу на метод. Qt, например, этим хаком вовсю пользуется.

Вот в языках со строгой модульностью (Object Pascal, например) такой фокус уже не пройдёт.

hobbit ★★★★★
()

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

Но даже это сильно коробит если не в самом начале файла.

В плюсовом коде видел реализацию класса в котором количество методов перевалило все разумные пределы и от объёма кода начинали тупить иде/редакторы. Причём, логически там ничего нельзя было разнести. Сделали file.cpp и file1.cpp с комментариями в каждом.

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