2017-01-31 8 views
0

Где в стандарте C указывается, что я не могу многократно объявлять один и тот же идентификатор в той же области блока?переменная с объемом блока - много декларация - стандартная?

+0

Вы всегда можете прочитать [проект C11] (http://www.open-std.org/jtc1/sc22/wg14/www/standards.html) и искать себя. –

+0

Я подразумеваю, я думаю. – Sabrina

ответ

5

Некоторые идентификаторы могут быть обьявленными, такими как struct теги и extern объектов. Но локальные переменные не могут:

void bar(void) 
{ 
    int a; 
    int a; // constraint violation, 'a' declared a second time 
} 

и что требуется C99 раздел пункта 6.7 3:

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

Это предложение «должно» в разделе «ограничения», поэтому нарушающая его программа плохо сформирована.

В стандарте C никогда не используется термин «локальная переменная», но «идентификатор [который] не имеет связи» - это почти то же самое. (Вы можете видеть, что это не совсем то же самое, или нет необходимости создавать исключение для тегов.) Для точного определения см. Раздел 6.2.2.

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

+0

Что вы подразумеваете под '' No linkage 'означает приблизительно «локальная переменная» '? Вероятно, есть лучший способ сказать, что компоновщик не имеет дело с локальными переменными, если это то, о чем вы говорите. –

+0

Спасибо большое, я много искал. – Sabrina

+0

@barakmanos Я попробую уточнить. – zwol

0

Вы можете объявить тот же идентификатор много раз в блоке Область применения:

int main() 
{ 
    extern int x; 
    extern int x; 
    extern int x; 
} 

Здесь мы имеем три объявления x при объеме блока. Это справедливо, поскольку все они имеют совместимые типы (C11 6.7/4) и ту же связь.

Я думаю, что вы хотите спросить, почему вы не можете определить тот же идентификатор, что и переменная много раз. Это покрыто C11 6.7/3:

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

Термин «отсутствие сцепления» охватывает раздел о связи, 6.2.2. Переменные, определенные в области блока, имеют «отсутствие связи» (6.2.2/6). В предыдущей цитате помните, что все определения являются декларациями; поскольку в нем сказано, что не может быть нескольких объявлений без ссылки, следует, что не может быть нескольких определений.

+0

Я бы использовал 'экземпляр' вместо' define'. –

+0

@barakmanos «define» - это термин, используемый стандартом C –

+0

OK, но его можно смутить с помощью директивы препроцессора ('# define') IMO. –

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

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