2015-04-22 2 views
2

Как я знаю, что это заявление:Декларирование против определения переменных в с

int i; 

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

int i = 10; 

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

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

+1

В некотором смысле, когда вы определяете символ, который еще не был объявлен, вы оба объявляете и определяете символ. –

+1

C имеет концепцию [предварительное определение] (http://port70.net/~nsz/c/c11/n1570.html#6.9.2). – pmg

+0

Обе строки являются декларациями. Оба могут быть определениями (и обычно являются). –

ответ

2

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

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

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

4

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

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

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

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

Из C standard (n1256):

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

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

И это, конечно, означает, что * обе строки кода в вопросе могут быть определениями. –

3

«Разве компилятор выделяет память для заявленных (но не определенных) переменных?»

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

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

Смежные вопросы