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