Объявление против определения переменных в c
Как я знаю, это декларация:
int i;
и это определение:
int i = 10;
Может быть, я не прав, я не спорю.
Вопрос в том, выделяет ли компилятор память для объявленных (но не определенных) переменных?
3 ответа
Компилятор выделяет память для объявленных (но не определенных) переменных?
Нет, компилятор просто запомнит это имя и тип переменной. Нет памяти выделено для объявления.
int i;
может вести себя как определение, если i
используется (не оптимизировано) и не имеет другого определения i
присутствует в любом другом модуле компиляции, и для него будет зарезервировано хранилище. (потому что хранилище зарезервировано для определений)
Определение - это когда память выделяется для переменной. Декларация не подразумевает, что хранилище уже выделено.
Объявление используется для доступа к функциям или переменным, определенным в разных исходных файлах или в библиотеке. Несоответствие между типом определения и типом объявления приводит к ошибке компилятора.
Вот несколько примеров объявлений, которые не являются определениями, в C:
extern char example1;
extern int example2;
void example3(void);
6.7 Объявления
...
5 Объявление определяет интерпретацию и атрибуты набора идентификаторов.
Определение идентификатора - это объявление для этого идентификатора, которое:
- для объекта вызывает сохранение хранилища для этого объекта;
- для функции включает тело функции;101)
- для константы перечисления или имени typedef является (единственным) объявлением идентификатора.
"Компилятор выделяет память для объявленных (но не определенных) переменных?"
Нет. Компилятор выделяет память только для (во время) определения переменной, а не для объявления переменной.
Вы можете лучше понять логику, используя простую аналогию, множественное объявление допускается для одной переменной, а множественное определение - нет.