2016-10-15 11 views
0

Вот extern и переменная static с таким же именем. На выходе печатается статическая переменная a = 10. Почему нет синтаксической ошибки и как я могу получить доступ к extern a, если это необходимо?Почему этот код не генерирует ошибку повторной записи?

#include<stdio.h> 
extern int a; 
static int a=10; 

main() 
{ 
    printf("%d\n",a); 
} 
+1

Arc хайский компилятор? Вы должны получать ошибки для своего основного. –

+0

@JonathanLeffler Вы уверены? Где стандарт C объясняет случай статического-после-экстерна? – AlexD

+0

@ AlexD: В моем комментарии ничего не говорится о главном предмете вопроса. Я только замечаю, что для C99 и C11 требуются 'int main (void)' или подобные. Компилятор, который принимает то, что было в вопросе, работает с архаичным стандартом C89 или C90. Это все. –

ответ

2

Стандарт C позволяет обратное, extern после static:

6.2.2 Linkages of identifiers
....
3 If the declaration of a file scope identifier for an object or a function contains the storage-class specifier static , the identifier has internal linkage.

4 For an identifier declared with the storage-class specifier extern in a scope in which a prior declaration of that identifier is visible, if the prior declaration specifies internal or external linkage, the linkage of the identifier at the later declaration is the same as the linkage specified at the prior declaration. If no prior declaration is visible, or if the prior declaration specifies no linkage, then the identifier has external linkage.

В то же время он заявляет:

7 If, within a translation unit, the same identifier appears with both internal and external linkage, the behavior is undefined.

BTW, стандарт C++ делает его явным:

7.1.1 Storage class specifiers
....

static int b; // b has internal linkage 
extern int b; // b still has internal linkage 

....

extern int d; // d has external linkage 
static int d; // error: inconsistent linkage 
+0

Спасибо, и я могу получить ссылку на источник? – Anjaneyulu

+0

extern int d; // d имеет внешнюю связь static int d; // ошибка: несогласованная связь Я не получил это, т. е. применимо к C++ – Anjaneyulu

+0

@Anjaneyulu «_может ли я получить ссылку на источник». Проверьте http://stackoverflow.com/q/81656, чтобы узнать, где получить стандарты C и C++ , – AlexD