Объявление и определение переменных в c

Насколько я знаю, это заявление:

int i;

а это определение:

int i = 10;

Может я ошибаюсь, не спорю.

Вопрос: ли компилятор выделяет память для объявленных (но не определенных) переменных?


person Radoslaw Krasimirow    schedule 22.04.2015    source источник
comment
В некоторой степени это связано с тем, что когда вы определяете символ, который еще не был объявлен, вы одновременно объявляете и определяете символ.   -  person Some programmer dude    schedule 22.04.2015
comment
C имеет концепцию предварительного определения.   -  person pmg    schedule 22.04.2015
comment
Обе строки являются объявлениями. Оба могут быть определениями (и обычно так и есть).   -  person undur_gongor    schedule 22.04.2015


Ответы (3)


Выделяет ли компилятор память для объявленных (но не определенных) переменных?

Нет, компилятор просто запишите имя и тип этой переменной. Для объявления не выделяется память.

int i; может вести себя как определение, если i используется (не оптимизировано) и никакое другое определение i не присутствует ни в каком другом Единица компиляции и хранилище будут зарезервированы для нее. (поскольку память зарезервирована для определений)

person Mohit Jain    schedule 22.04.2015

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

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

Вот несколько примеров объявлений, которые не являются определениями в C:

extern char example1;
extern int example2;
void example3(void);

Из стандарта C (n1256):

6.7 Declarations
...
5 A declaration specifies the interpretation and attributes of a set of identifiers.

A definition of an identifier is a declaration for that identifier that:
— for an object, causes storage to be reserved for that object;
— for a function, includes the function body;101)
— for an enumeration constant or typedef name, is the (only) declaration of the identifier.
person Sadique    schedule 22.04.2015
comment
И это, конечно, подразумевает, что обе строки кода в вопросе могут быть определениями. - person Some programmer dude; 22.04.2015

"Выделяет ли компилятор память для объявленных (но не определенных) переменных?"

Нет. Компилятор выделяет память только для (во время) определения переменной, а не для объявления переменной.

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

person Sourav Ghosh    schedule 22.04.2015