Объявление vs определение переменных в c [дубликат]


На этот вопрос уже есть ответ здесь:

  • В чем разница между определением и декларацией? 26 ответов

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

int i;

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

int i = 10;

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

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

3 2

3 ответа:

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

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

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

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

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

Вот некоторые примеры деклараций, которые не являются определениями, в языке C:

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

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

6.7 декларации
...
5 объявление определяет интерпретацию и атрибуты набора идентификаторов.

а определение идентификатора является объявление для этого идентификатора, что:
- для объекта, заставляет хранилище быть зарезервированным для этого объекта;
- для функции включает в себя тело функции;101)
- для константы перечисления или имени typedef, является (только) объявление то идентификатор.

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

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

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