-1
#include<stdio.h> 
int check,check; 
void main(){ 
    printf("Hello!!"); 
} 

Когда я составляю этот кусок кода, все идет нормально, но когда я даю это внутри основной функции,Глобальная переменная декларация в с

#include<stdio.h> 
void main(){ 
int check,check; 
    printf("Hello!!"); 
} 

Я получаю сообщение об ошибке, как

C:\MinGW\bin>cc ex1.c 
ex1.c: In function 'main': 
ex1.c:4:11: error: redeclaration of 'check' with no linkage 
int check,check; 
     ^
ex1.c:4:5: note: previous declaration of 'check' was here 
int check,check; 
    ^

Почему это так?

+0

Вы объявляете 2 переменных с тем же именем. Имя переменной может содержать только символы подчеркивания, буквы и цифры. – Mordi

ответ

1

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

Цитирование C11, глава §6.9.2

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

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

Подробнее об этом можно узнать here.

Сказанное, начиная с C99, для размещаемых объектов, void main() больше не является действительной подписью, оно должно быть как минимум int main(void).

+0

Чтобы сделать это ясно: два 'check' в области файла обозначают ** тот же ** объект! (и «область действия» слишком ограничительна. Это всегда верно для области блока) – Olaf

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

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