Как я знаю, что это заявление:Декларирование против определения переменных в с
int i;
и это определение:
int i = 10;
Может быть, я не прав, я не спорю.
Вопрос Задает ли компилятор память для объявленных (но не определенных) переменных?
Как я знаю, что это заявление:Декларирование против определения переменных в с
int i;
и это определение:
int i = 10;
Может быть, я не прав, я не спорю.
Вопрос Задает ли компилятор память для объявленных (но не определенных) переменных?
Задает ли компилятор память для заявленных (но не определенных) переменных ?
Нет, компилятор просто запомнит это имя и тип этой переменной. Для объявления не выделяется память.
int i;
может вести себя как определение, если i
используется (не оптимизированные) и no other definition из i
присутствует в любом другом устройстве хранения и компиляций будет зарезервирована для него. (потому что хранение зарезервировано для определений)
Определение - это когда хранилище распределено для переменной. Декларация не подразумевает, что хранение еще выделено.
Объявление используется для доступа к функциям или переменным, определенным в разных исходных файлах или в библиотеке. Несоответствие между типом определения и типом объявления создает ошибку компилятора.
Вот некоторые примеры заявлений, которые не являются определением, в C:
extern char example1;
extern int example2;
void example3(void);
6.7 Объявление
...
5 Декларации определяет интерпретации и атрибутов набора идентификаторов.
определение идентификатора является декларацией для этого идентификатора, что:
- для объекта, вызывает хранения должны быть зарезервированы для этого объекта;
- для функции включает корпус функции; 101)
- для константы перечисления или имени typedef является (только) декларацией идентификатора .
И это, конечно, означает, что * обе строки кода в вопросе могут быть определениями. –
«Разве компилятор выделяет память для заявленных (но не определенных) переменных?»
№ компилятор выделяет память только для определения переменной (в момент времени), а не для объявления переменной.
Вы можете лучше понять логику, используя простую аналогию, допускается множественное объявление для одной переменной, но множественное определение - нет.
В некотором смысле, когда вы определяете символ, который еще не был объявлен, вы оба объявляете и определяете символ. –
C имеет концепцию [предварительное определение] (http://port70.net/~nsz/c/c11/n1570.html#6.9.2). – pmg
Обе строки являются декларациями. Оба могут быть определениями (и обычно являются). –