2014-09-01 4 views
3

Как я знаю, объекты в C имеют 3 типа связей: 1) внешние 2) внутренние и 3) нет, а объекты, объявленные в области блока, как внутри тела функции, не имеют связей, если не предшествует ключевое слово " extern "или" static ".В C, если объекты, объявленные в области блока, не имеют связи, почему работает декларация функции внутри main() без «extern»?

Но почему тогда объявление функции ниже может ссылаться на определение ниже функции main(), хотя я не использовал «extern» во время объявления? Пожалуйста, объясните это, поскольку это бросает мое понимание проблемы вверх дном. Спасибо.

#include<stdio.h> 

int main() 
{ 
int foo(); //working even though I've not used "extern" 
printf("%d",foo()); 
} 

int foo() 
{ 
return 8; 
} 

РЕЗУЛЬТАТ ВЫШЕ ПРОГРАММЫ: 8

+0

@sashoalm, "linkage" - это термин, определенный стандартом C, который ничего не говорит о линкерах. Это языковая функция. –

+0

Поскольку вы вызываете эту функцию из 'main()' и 'main()' уже знает, что такое прототип этой функции. –

+0

@ Don'tYouWorryChild, нет, это не так, функция не определена до окончания 'main', поэтому ничего не известно об этом до тех пор, пока она не будет объявлена ​​в' main' –

ответ

5

и что объекты, объявленные в области блока, как внутри тела функции, не имеют связей, если не указано ключевое слово «extern» или «static».

Функции не являются объектами.

6.2.2 в С11 говорит

-5- Если объявление идентификатора для функции не имеет хранения класса спецификатор, его связи определяется точно так, как если бы она была объявлена ​​с хранением класса спецификатор extern. Если объявление идентификатора для объекта имеет область действия файла и спецификатор класса хранения, его связь является внешней.

В первом предложении говорится, что функция, объявленная в области файла, объявлена ​​как extern. Это применяется, даже если объявлено в области блока. Следующий абзац:

-6- Следующие идентификаторы не имеют связи: идентификатор, объявленный как нечто, отличное от объекта или функции; идентификатор, объявленный как параметр функции; идентификатор области блока для объявленного объекта без спецификатора класса хранения extern.

Это говорит BLOCK-Scope объекты не имеют никакой связи между ними, но не функции.

Вы не можете иметь вложенные функции в ISO C, поэтому было бы бессмысленно объявлять функцию области блока, если она не ссылалась на что-то вне блока.

+0

Спасибо, что отвечает на мой вопрос. – Meathead

+1

@Meathead, если это отвечает на ваш вопрос, почему бы не принять его как ответ? – zubergu

+0

@zubergu Я просто сделал ... – Meathead

1

функции не являются объектами. Итак, что вы говорите об объектах, не относится к функциям.

+0

Итак, можно сказать, что функции внешняя связь даже при объявлении в блоке? – Meathead

 Смежные вопросы

  • Нет связанных вопросов^_^