О Предварительном определении

Я считал из книги о предварительном определении это,

Предварительным определением является любое внешнее объявление данных, которое не имеет никакого спецификатора класса памяти и никакого инициализатора. Предварительное определение становится полным определением, если конец единицы перевода достигнут, и никакое определение не появилось с инициализатором для идентификатора

Объясните, что означает вышеупомянутый оператор. Кроме того, различие между Объявлением и Определением? Я был перепутан из-за этого.:( И почему не делает этой программы, дают ошибку:

#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;
}
34
задан Antti Haapala 2 July 2018 в 12:16
поделиться

2 ответа

Объявление переменной говорит: «В программе есть переменная со следующим именем и типом».

В определении переменной говорится: «Уважаемый господин компилятор, выделите сейчас память для переменной со следующим именем и типом».

Таким образом, для одной и той же переменной может быть несколько объявлений, но должно быть только одно определение.

В C чистым объявлениям (которые также не являются определениями) предшествует ключевое слово extern . Итак, поскольку у вас нет этого ключевого слова в вашем первом примере, у вас есть два определения. На первый взгляд, это может показаться проблемой (и на самом деле это ошибка C ++), но в C есть специальное правило «предварительного определения», которое позволяет несколько определений для одной и той же переменной, если все они совпадают, и не более одного. имеет инициализатор. Компилятор C за кулисами объединяет все предварительные определения в одно определение.

Если бы вы попытались инициализировать оба определения, например:

int a = 1;
int a = 2;

, то произошла бы ошибка.

Ваш второй вопрос более простой. В C у вас просто не может быть исполняемых операторов вне тела функции. Это просто недопустимо. Подумайте об этом: когда вы ожидали бы его запуска, если бы это было разрешено?

63
ответ дан 27 November 2019 в 16:31
поделиться

Первое работает, потому что оба ваших определения a являются предварительными, и их можно дублировать так часто, как вы сочтете нужным. В конце единицы перевода не было замечено никаких предварительных определений, поэтому то, что вы указали для атрибутов, объединено со значениями по умолчанию, чтобы дать окончательное определение a , поэтому оно будет иметь внешнюю связь , длительность статического хранения и инициализируется значением 0.

Проблема со вторым не имеет ничего общего с предварительными определениями.Ваш printf ("Hi"); должен находиться внутри функции для работы - это не объявление или определение (предварительное или иное); там это просто запрещено.

11
ответ дан 27 November 2019 в 16:31
поделиться
Другие вопросы по тегам:

Похожие вопросы: