Определение и объявление переменной со значением - PullRequest
1 голос
/ 25 февраля 2011

Только что начал с K & R и во 2-й главе есть строка:

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

Итак:

int x = 42 является определением .

и int x - это объявление , но также определение , поскольку каждое определение является объявлением .

Но когда мы присваиваем начальное значение, например K & R скажем, не делает ли это объявление a определение ?

Ответы [ 2 ]

2 голосов
/ 25 февраля 2011

Вы путаете две вещи:

  1. В объявлении указывается ( объявляет ), что * тип, имя и область действия объекта
  2. Определение определяет , что такое содержимое объекта

* объект как в: переменная, функция и т. д., а не объект ООП.

Следовательно, определение очень часто является также объявлением,так как вы не можете определить, что находится в объекте, если вы не указали тип объекта.Проще всего запомнить: «Каждое определение является объявлением, но не каждое объявление является определением»

Для переменных

Существует только 1 способ объявления без определенияпеременная:

extern typeX variable_name

Это говорит компилятору, что существует переменная с именем variable_name с типом typeX, но не где ее получить.Любой другой способ объявления переменной также является определением, поскольку он сообщает компилятору зарезервировать для нее место и, возможно, присвоить ей начальное значение.

Разница в структурах и функциях намного более очевидна:

Для структур

Объявление:

struct some_struct{
    int a;
    int b;
}

Это объявляет some_struct для компилятора с a и b как структурные переменные и с типом int.

Только когда вы определяете их, пространство зарезервировано, и вы можете использовать их:

void foo(){
    struct some_struct s;
    s.a = 1; // For this to work s needs to be defined
}

Для функций :

Разница гораздо более очевидна

объявление:

// This tells the compiler that there is a function called "foo" that returns void and takes void arguments
void foo();

Определение может быть таким же, как указано выше (в части struct)

1 голос
/ 25 февраля 2011

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

В этом смысле оба ваших определения являются определениями, и любое определение также является делкарацией.

Я думаю, что это может быть ошибкой K & R ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...