Определение функции внутри main()

Из любопытства, считается ли плохой практикой определять функцию внутри main() в C?

Моя проблема с текущей программой, которую я пишу, заключается в том, что у меня есть 20 указателей на структуры, которые определены внутри main() (указатели, а не сами структуры, они находятся в других файлах), и у меня есть блок кода, который должен вызываться несколько раз с разными параметрами, и он должен иметь возможность модифицировать любой из указателей. Единственное решение, которое я нашел (я новичок в C), состояло в том, чтобы определить функцию внутри main(), которая имеет правильную область действия для изменения любого из указателей.


person fr00ty_l00ps    schedule 08.04.2014    source источник
comment
Это не плохая практика, вы просто не можете.   -  person Maroun    schedule 08.04.2014
comment
У GCC не было шипения, и он работал, как и планировалось ... Как мне повезло, я нахожусь на другом компьютере, на котором я писал код, и не могу поделиться тем, что у меня есть ...   -  person fr00ty_l00ps    schedule 08.04.2014
comment
Используйте -pedantic, и он будет жаловаться: warning: ISO C forbids nested functions   -  person Shafik Yaghmour    schedule 08.04.2014
comment
@MBlanc Согласен. Я пометил его как дубликат. Мои извинения.   -  person fr00ty_l00ps    schedule 08.04.2014
comment
"I have 20 some structs that are defined inside of main()". Это ваша основная проблема, у вас нет дизайна программы. Решение вашей проблемы состоит не в том, чтобы еще больше запутать вашу программу, а в том, чтобы разделить вашу программу на независимые модули, используя объектно-ориентированный подход, где каждый модуль знает только о своей собственной задаче.   -  person Lundin    schedule 08.04.2014
comment
@Lundin Я не понял. У меня есть сами определения структур в другом файле, но физические переменные (я бы сказал, объекты) определены в main(). Смотрите вопрос сейчас, как я его исправил   -  person fr00ty_l00ps    schedule 08.04.2014
comment
Тем не менее, необходимость создавать подобные странные вещи почти наверняка возникает из-за грязного дизайна программы.   -  person Lundin    schedule 08.04.2014


Ответы (3)


Вложенные функции (функции внутри функций) являются расширением только GNU и не являются частью какого-либо обычного стандарта C. Любой другой компилятор не сможет это скомпилировать. В связи с этим я бы крайне не рекомендовал использовать вложенные функции.

Объявите свои структуры и функции снаружи. Затем вы всегда можете передать указатель на свои структуры данных в свою функцию.

struct s {...};

void foo(struct s *, ...);

int main() {

  struct s mystruct;
  foo(&mystruct, ...);

}
person Sergey L.    schedule 08.04.2014

GCC позволяет это, но это нестандартное расширение, специфичное для этого компилятора, поэтому ваш код не будет компилироваться ни на каком другом компиляторе.

person Anonymouse    schedule 08.04.2014

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

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

person mesmerizingr    schedule 08.04.2014