Объявление функции C внутри другой функции - PullRequest
6 голосов
/ 04 февраля 2011

Может кто-нибудь объяснить мне эти строки:

int xyz( void )  
{ 
extern void abc( void );
}

объявление функции в определении функции?или я что-то неправильно понимаю?

Ответы [ 5 ]

11 голосов
/ 04 февраля 2011

Да, ваше предположение верно.Он объявляет о существовании функции abc(), поэтому на нее можно ссылаться в xyz().Обратите внимание, что extern не требуется, так как функции по умолчанию extern.

2 голосов
/ 17 мая 2016

У этого способа объявления есть одно большое преимущество:

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

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

Последнее примечание к теме «Написание внешнего / не внешнего»: Если это просто предварительное объявление (-> функция определена в конце того же файла), я бы не рекомендовал использовать external - потому что это просто не тот случай. В противном случае внешний имеет абсолютный смысл указывать на то, что определение должно быть найдено где-то еще (или для библиотек: пользователям этого библиотеки может потребоваться реализация).

Надеюсь, это поможет (как шаг к более объективному стилю программирования .. :))

2 голосов
/ 04 февраля 2011

Объявление "extern" в C должно указывать на существование и тип глобальной переменной или функции.

Extern - это то, что определено внешне для текущего модуля.

Также нередко можно найти прототипы функций, объявленные как extern.

Он нужен вам только там, где он не используется по умолчанию и / или где вы хотите указать связь "C".

0 голосов
/ 06 февраля 2011

Я бы просто добавил, что эта конструкция, по моему опыту, необычна в современном коде, но часто встречается в более старом коде, особенно в коде "K & R" C.

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

0 голосов
/ 04 февраля 2011

Да, ваше утверждение верно ..... когда мы используем extern func_name, мы объявляем func_name.

...