может кто-нибудь объяснить эти строки мне:C объявление функции внутри другой функции
int xyz(void)
{
extern void abc(void);
}
объявление функции в определении функции? или я что-то не понимаю?
может кто-нибудь объяснить эти строки мне:C объявление функции внутри другой функции
int xyz(void)
{
extern void abc(void);
}
объявление функции в определении функции? или я что-то не понимаю?
Да, ваше предположение верно. Он объявляет о существовании функции abc()
, поэтому на нее можно ссылаться в пределах xyz()
. Обратите внимание, что extern
не требуется, поскольку по умолчанию функции extern
.
Декларация «extern» в C означает указание наличия и типа глобальной переменной или функции.
Внешний вид - это то, что определено снаружи для текущего модуля.
Также не редко можно найти прототипы функций, объявленные как внешние.
Вам это нужно, только если это не значение по умолчанию и/или где вы хотите указать ссылку «C».
Да, ваше утверждение верно ..... когда мы используем extern func_name w, объявляем имя func_name.
Я бы просто добавил, что эта конструкция, по моему опыту, необычна в современном коде, но часто встречается в более старом коде, особенно «K R» C код.
Более современный код обычно получает прототип функции из файла заголовка.
Этот способ декларации имеет одно большое преимущество:
Если только один или менее функции вызова внешней функции, это заявление имеет смысл, особенно в большом исходном файле. Если более поздняя реструктуризация кода (функция перемещается в другом файле) должна быть выполнена, гораздо легче увидеть зависимости, чем добавлять внешние элементы в глобальную (файловую) область. В последнем случае вероятность «забыть» такие внешние значения в файле выше. В противоположность этому, объявив его в области функций, декларация будет перемещаться вместе с функцией ...
Я также склонен делать это для внешних глобальных переменных - преимущество приходит позже при сохранении и, в конечном счете, реструктуризации/минимизации зависимостей.
Последнее примечание к теме «Запись внешнего/не внешнего»: Если его просто объявление вперед (-> функция определено в конце того же файла), я бы не рекомендовал использовать внешний - потому что это просто не так. В противном случае внешний смысл имеет смысл указывать, что определение должно быть найдено где-то в другом месте (или для libaries: возможно, должно быть реализовано пользователями этой библиотеки).
Надеюсь, что это поможет (как шаг к более объективному направлению программирования .. :))
Я бы не стал называть extern ненужным. Можно сказать, что писать extern перед прототипом является более правильным грамматическим, вместо того, чтобы иметь его там неявно. Лично я всегда пишу extern перед прототипами, потому что это дает мне привычку всегда писать что-то перед ними. Таким образом, я не забуду написать статику перед функциями, которые должны быть конфиденциально инкапсулированы. – Lundin
@ Lundin: Вы пишете 'auto' перед всеми локальными переменными? –
, но зачем объявлять о существовании внутри функции, а не непосредственно в файле (например, перед определением каждой функции). Или это может вызвать ссылку на определенный момент, а не во время компиляции? – binaryguy