Разница между определением и объявлением

Возможный дубликат:
В чем разница между определением и декларацией?

Я пытаюсь полностью понять «определение» и «объявление» в C.

Я считаю, что x здесь определен, поскольку внешние переменные автоматически инициализируются значением 0, а то, что объявлено и инициализировано, определено. Это точно?

int x;
main() {}

По словам одного x в данном случае есть определение, но почему? Он не инициализируется ...

int print_hello()
{
  int x;
}

person user257412    schedule 10.12.2010    source источник
comment
Прочтите этот ответ.   -  person Prasoon Saurav    schedule 10.12.2010


Ответы (3)


Объявление сообщает компилятору, что существует переменная, которая выглядит так.

Определение сообщает компилятору, что это переменная.

Один относится к существованию вещи, другой - к вещи.

В вашем примере разница в объеме. Объявления делаются в области видимости файла, но в области видимости блока объявить что-либо невозможно; поэтому второй пример - это определение; потому что с int x; больше нечего делать.

Это делает первый пример (в области видимости файла) объявлением о существовании некоторого int x;. Чтобы скрыть его от объявления, вам нужно указать, что ему присвоено значение, принудительно выделяя память. Вот так: int x = 0;

C и C ++ очень чувствительны к области видимости при анализе конструкций.

person Edwin Buck    schedule 10.12.2010
comment
спасибо, но я это понял :) Edit: так, это определено, потому что это единственная альтернатива ?? Думаю, мне просто придется это ограбить. - person user257412; 10.12.2010
comment
Извините, я слишком рано нажал «Отправить», поэтому мне пришлось отредактировать его, чтобы добавить часть, которая касалась вашего фактического вопроса. - person Edwin Buck; 10.12.2010
comment
но его первый пример - тоже определение, не так ли? - person lijie; 10.12.2010
comment
На самом деле первый пример - это не определение, это всего лишь декларация. Чтобы преобразовать его в определение, вам нужно присвоить ему значение. Правила немного отличаются между C и C ++. Вот почему гораздо лучше принудительно использовать ключевое слово extern. - person Edwin Buck; 10.12.2010
comment
первое определенно определение .. я думаю - person user257412; 10.12.2010
comment
Предварительные определения отличаются от обычных определений. Эдвин в значительной степени точен, за исключением того, что предварительное определение - это не простое предварительное объявление, это определение, но может быть несколько из них, которые относятся к одному и тому же объекту. Будь осторожен! - person Carl Norum; 10.12.2010

«Определить» не означает «инициализировано». Это означает, что что-то создается, а не просто упоминается.

Определение выделяет, но не обязательно инициализирует память. Это может привести к интересной отладке.

person Andy Thomas    schedule 10.12.2010
comment
так что, даже если переменная не была инициализирована, ее можно определить? но я прочитал это определение = объявление + инициализация, здесь - ubuntuforums.org/showthread.php? t = 1501482 & page = 1 - person user257412; 10.12.2010
comment
Из c-faq: определение - n. 1. Объявление переменной или функции, которая выделяет и при необходимости инициализирует (в случае переменной) или предоставляет тело функции (в случае функции). - c-faq.com/sx1/index.html#definition - person Andy Thomas; 10.12.2010
comment
должен был прочитать это ... хорошо, значит, ответ - да. даже если переменная не была инициализирована, ее можно определить. Дело в том, что для определения должна быть выделена память? - person user257412; 10.12.2010
comment
Для переменных да, определение выделяет память. Есть и другие определения для других конструкций. Общим для всех является то, что может быть одно определение, но несколько объявлений. - person Andy Thomas; 10.12.2010

Объявление вводит имя в ЕП. Определение создает / выделяет хранилище для этого имени.

int x; //definition,also a declaration. Every definition is a declaration.
int main(){}
person rMan    schedule 10.12.2010