2015-07-16 2 views
1

Я знаю, что этот вопрос задан много раз, но я не нашел ответа. Согласно CВопрос об определении и определении

int x;  //definition 

extern int x; //declaration 

int func(void); //declaration 
int func(void) //definition 
{ 

} 

Мой первый вопрос, если ИНТ х является определение, то почему компилятор выдает сообщение об ошибке переопределение

header files 
int main() 
{ 
    int x,x;  //for this it shows redeclaration error 
} 

И мой второй вопрос, если я определяю УАК х, дважды его не показывает каких-либо ошибок

header files 
int x; 
int x; 
int main() 
{ 

} 

Я использую окно 7 и DevCpp 5.6.2

Отредактировано:

header files 
int y; 
int main() 
{ 
    int x; 
} 

x и y здесь определение?

+0

«файлы заголовков» недействительны C-кодом. Это фактическое содержимое вашего файла? – immibis

ответ

4

Декларация переменной в области видимости файла без инициализатора (и без класса хранения спецификатора) является предварительное определение:

int i; 

Это действительно иметь несколько предварительных определений одного и того же переменная в том же исходном файле:

int i; 
int i; 

поведение определяется C, как если есть заявление в верхней части исходного файла и t в конце исходного файла есть int i = 0;.

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

1

Относительно первого вопроса: int x является декларацией и определением, тогда как extern int x является только декларацией. Вот почему вы получаете ошибку повторного выделения.

+0

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

1

Вашего первый код, получает ошибку переопределения, потому что в вашем случае, x является не имеющими связей (локальным переменным) и в соответствии с C11, главой 6.7,

Если идентификатор не имеет никакой связи между ними, там должен не будет не более чем один декларация идентификатора (в описатель или спецификатор типа) с той же области и в том же пространстве имен, ....

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

Ref:

Если объявление идентификатора для объекта имеет файл объем и не хранение класса спецификатора, его связь является внешней.