Почему объявление внешней переменной внутри main () работает, но не определяет ее внутри main ()?

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

В следующей примерной программе я объявил extern переменную x внутри функции ( main() ). Теперь, если я определяю переменную в области файла сразу после main() и присваиваю ей 8 , то программа отлично работает и 8 но если я определяю переменную x внутри main() после printf() , ожидая, что объявление extern будет ссылаться на нее, тогда она терпит неудачу и даст следующую ошибку:

 test.c||In function 'main':| test.c|7|error: declaration of 'x' with no linkage follows extern declaration| test.c|5|note: previous declaration of 'x' was here| ||=== Build finished: 1 errors, 0 warnings ===| #include int main() { extern int x; printf("%d",x); int x=8; //This causes error } //int x=8; //This definition works fine when activated 

Я вижу только одну ошибку в коде, что оператор int x=8 означает, что мы объявляем x снова как переменную с classом auto REST Я не понимаю. Можете ли вы сказать мне следующее:

1) Почему нам разрешено объявлять extern переменную внутри функции без каких-либо предупреждений или ошибок? Если она действительна, что именно это означает?

2) Так как мы объявили x как extern внутри функции и не обнаружили ошибки, почему тогда это заявление не ссылается на определение переменной внутри функции, но выходит наружу, когда переменная определена вне? Является ли конфликтное объявление classа хранения auto-vs-extern причиной этого?

extern variable является promiseм компилятору, что определение глобальной переменной будет где-то еще. Локальные переменные не квалифицируются как выполнение обещания компилятору, потому что они невидимы для компоновщиков. В некотором смысле декларации extern похожи на декларацию функций вперед: вы говорите компилятору «Я знаю, что эта функция существует, поэтому позвольте мне использовать ее сейчас, и пусть компоновщик позаботится о поиске фактической реализации».

 Why are we allowed to declare an extern variable inside a function,without any warning or error?If valid,what exactly does it mean? 

Ans: – мы можем использовать extern на функциональном уровне, чтобы разоблачить его только в рамках этой функции.

 Since we declared x as extern inside the function and it showed no error,why then this declaration doesn't link to the definition of the variable inside the function,but looks outside,when the variable is defined outside? Is conflicting storage-class declaration auto-vs-extern the reason for this? 

Ans: Переменные, объявленные в области блока (т.е. локальные переменные), не имеют привязки, если только они явно не декалированы как extern.

просто запомните понятие, что, когда мы объявляем переменную как extern внутри функции, мы можем определить ее только вне этой функции.

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