Я считал из книги о предварительном определении это,
Предварительным определением является любое внешнее объявление данных, которое не имеет никакого спецификатора класса памяти и никакого инициализатора. Предварительное определение становится полным определением, если конец единицы перевода достигнут, и никакое определение не появилось с инициализатором для идентификатора
Объясните, что означает вышеупомянутый оператор. Кроме того, различие между Объявлением и Определением? Я был перепутан из-за этого.:( И почему не делает этой программы, дают ошибку:
#include <stdio.h>
int a; //Tentative definition
int a; //similarly this declaration too.
int main() //not getting any error with this code why its so?
{
printf("hi");
}
Кроме того, что не так с этим кодом:
#include<stdio.h>
printf("Hi");
int main(void){
return 0;
}
Объявление переменной говорит: «В программе есть переменная со следующим именем и типом».
В определении переменной говорится: «Уважаемый господин компилятор, выделите сейчас память для переменной со следующим именем и типом».
Таким образом, для одной и той же переменной может быть несколько объявлений, но должно быть только одно определение.
В C чистым объявлениям (которые также не являются определениями) предшествует ключевое слово extern
. Итак, поскольку у вас нет этого ключевого слова в вашем первом примере, у вас есть два определения. На первый взгляд, это может показаться проблемой (и на самом деле это ошибка C ++), но в C есть специальное правило «предварительного определения», которое позволяет несколько определений для одной и той же переменной, если все они совпадают, и не более одного. имеет инициализатор. Компилятор C за кулисами объединяет все предварительные определения в одно определение.
Если бы вы попытались инициализировать оба определения, например:
int a = 1;
int a = 2;
, то произошла бы ошибка.
Ваш второй вопрос более простой. В C у вас просто не может быть исполняемых операторов вне тела функции. Это просто недопустимо. Подумайте об этом: когда вы ожидали бы его запуска, если бы это было разрешено?
Первое работает, потому что оба ваших определения a
являются предварительными, и их можно дублировать так часто, как вы сочтете нужным. В конце единицы перевода не было замечено никаких предварительных определений, поэтому то, что вы указали для атрибутов, объединено со значениями по умолчанию, чтобы дать окончательное определение a
, поэтому оно будет иметь внешнюю связь , длительность статического хранения и инициализируется значением 0.
Проблема со вторым не имеет ничего общего с предварительными определениями.Ваш printf ("Hi");
должен находиться внутри функции для работы - это не объявление или определение (предварительное или иное); там это просто запрещено.