Всегда ли конфликтующие типы являются проблемой в C? - PullRequest
3 голосов
/ 26 февраля 2009

У меня возникают проблемы с ростом с Java на C. Я привык иметь разные методы с одинаковыми именами, но с разными параметрами. В C это создает проблемы?

Cell makeCell(int dim, int iterations, Cell parent);

Cell makeCell(Cell parent);

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

Ответы [ 8 ]

10 голосов
/ 26 февраля 2009

В C у вас нет перегруженных функций - функций с одинаковыми именами, но с разными типами аргументов (игнорируя эзотерику, такую ​​как <tgmath.h> в C99).

Функции должны иметь разные имена.

Или используйте другой язык, который поддерживает имена перегруженных функций.

5 голосов
/ 26 февраля 2009

В C нет никакой перегрузки, как вы понимаете, в Java или C ++ (несмотря на серьезную серьезную перегрузку, созданную вручную с помощью указателей функций, используйте C ++, а не C с kludges :-), поэтому вам следует вы подозреваете, называйте их разными именами функций.

Но не называйте их _makeCell или makeCell2, поскольку это не носит описательный характер. Как насчет:

Cell makeCellFromDimensionAndIteration(int dim, int iterations, Cell parent);
Cell makeCell(Cell parent);

Это первое можно сократить, но убедитесь, что оно все еще имеет значение. makeCell2 будет очень мало значить для того, кто читает код (включая вас через шесть месяцев в будущем).

3 голосов
/ 26 февраля 2009

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

2 голосов
/ 26 февраля 2009

Как уже упоминалось, нет способа создать две функции с одинаковым именем, вы можете использовать что-то вроде:

Cell makeCell(Cell parent, int dim, int iterations);

для обоих случаев и передайте некоторое «специальное значение», чтобы различать два случая. Например:

cell = makeCell(par,-1,-1);

Другой вариант, который я вижу, это использовать переменное количество аргументов:

Cell makeCell(Cell parent, ...);

но тогда у вас есть проблема определения количества переданных аргументов, и если вы не можете сделать это, глядя на «родителя», вы в основном возвращаетесь к предыдущему случаю, так как вам нужно использовать «специальное значение» указать количество параметров.

Если это своего рода конструктор (как следует из названия), я бы предпочел две функции:

Cell makeCell(Cell parent);
Cell setCell(Cell cell, int dim, int iterations);

один, который создает новую пустую ячейку, и другой, который устанавливает то, что должно быть установлено. Конечно, это зависит от природы "Cell", если это жизнеспособный вариант для вас.

2 голосов
/ 26 февраля 2009

Добро пожаловать в ад. Есть одно большое плоское пространство имен, без перегрузки, поэтому вам нужны соглашения, которые помогут вам придумывать и управлять именами. Хорошее место для поиска вдохновения - интерфейсы и реализации Дейва Хэнсона C .

Для вашего конкретного примера я бы предложил что-то вроде этого:

Cell_T Cell_with_dim(int dim, int iterations, Cell_T parent);

Cell_T Cell_of_parent(Cell_T parent);

(Не очень уверен в этих предложениях, потому что мне трудно догадаться, что должны делать разные перегрузки.)

1 голос
/ 26 февраля 2009

Ну, в C нет перегрузки функций, но если вы хотите или должны использовать C, вы можете добиться чего-то похожего, создав функцию, которая принимает переменное число аргументов. Вы можете начать здесь для получения информации о различных методах, некоторые из которых являются довольно переносимыми: http://en.wikipedia.org/wiki/Stdarg.h

В целом, однако, я бы предостерег от слишком частого использования этого трюка в C. Наиболее распространенная причина использования функций с переменными аргументами состоит в реализации функций, подобных printf(), а не для перегрузки функций в kludges. Но он есть, если хочешь.

0 голосов
/ 26 февраля 2009

Это распространенная проблема, потому что вы не можете перегружать функции в C. Только компилятор может (как в tgmath.h). Изучение tgmath.h GCC уже послужило моему хакометру на сегодня. Они нашли правильные слова, я думаю

/* This is ugly but unless gcc gets appropriate builtins we have to do
 something like this. Don't ask how it works. */

Люди придумали разные способы ее решения. Например, OpenGL проходит курс, в котором они включают типы параметров и учитываются в имени функции:

glVertex3f

Чтобы сказать, что функция занимает 3 числа с плавающей запятой.

0 голосов
/ 26 февраля 2009

Если вы работаете с Java, вам может показаться, что C ++ гораздо проще понять, чем C. И, поскольку используемый вами компилятор почти наверняка является компилятором C ++, почему бы не попробовать?

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