2016-10-05 17 views
6

Это answer смутило меня.Заявление и определение путаницы в C

Если у нас есть две строки в одном файле .c:

extern int c; 
int c; 
  • Как это первая строка кода декларации и второе определение?
  • Не являются ли обе декларации?
  • Как эти две линии отличаются?
+0

Первый означает, что где-то 'c' определяется как 'int'. – LPs

+0

Оба являются декларациями. в зависимости от того, где он размещен, второй - ** также ** определение или определение _. – Olaf

ответ

2

Ключевое слово extern - это то, что делает первую строку декларацией. Он говорит, что «эта переменная существует где-то». Подобная строка может отображаться в файле заголовка.

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

1

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

Edit: Чтобы понятнее: определение как определяет и объявляет, декларацию ТОЛЬКО декларирует. Когда вы используете ключевое слово extern по определению, вы ничего не определяете. Ваше замешательство проистекает из the understanding из extern.

+0

Это не отвечает на вопрос. – Olaf

+0

См. Отредактированный ответ @Olaf. – iWillGetBetter

+0

Он все еще что-то не хватает. И есть больше декларации, чем говорить о существовании объекта. Подсказка: для этого будет что-то вроде 'extern my_variable;' будет достаточно (это типично для языка ассемблера). – Olaf

2

определения создает пространство для переменного:

int c; 

Где бы вы поставить эту строку, либо локальным, глобальным, это говорит о том, что новая переменная c типа int должна ожить.

extern int c; 

декларация говорит, что есть где-то еще какая-то переменная c типа int. Используя extern, вы говорите, что c определен где-то в другом месте. Если вы укажете только объявление extern без определения где-то еще, у вас будет ошибка ссылки. Использование EXTERN является эквивалентом упреждающего объявления функции:

/* declaration */ 
int f(int x); 

против

/* definition */ 
int f(int x) { 
    return x*x; 
} 

Первого означает, что есть где-то функция f возвращающие int и принятие в int в качестве параметра. Последняя - это фактическая функция, ее код, который также работает как декларация, так и определение.

IMO, это объявление с обозначением vs-definition запутанно.Я почти не помню, что это такое, и мне обычно нужно об этом думать. Вы должны, однако, понять, что означает extern и что такое форвардная декларация.

2

Когда программа, которую вы пишете, состоит из нескольких исходных файлов, связанных друг с другом, где некоторые из переменных, определенных, например, в исходном файле file1.c, необходимо ссылаться в других исходных файлах, поэтому это причина используя extern.

О ваш вопрос, как эти линии отличаются:

extern int c; 
int c; 
  • переменная определена, когда компилятор выделяет память для переменной в то время как

  • переменная объявлена, когда компилятор сообщил, что существует переменная (и это ее тип); он не выделяет память для переменной в этой точке.

так что только int c; определен в то время как extern int c; объявляется.

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

  • Нет связанных вопросов^_^