clang, gcc и VS2013 все жалуются на переопределение w
в main()
, но я не смог найти в стандарте что-либо, запрещающее это.
namespace N {
extern int j;
int j;
}
int main()
{
extern int w;
int w;
}
В этих параграфах говорится об использовании объявления extern
в области блока, но они, похоже, не оправдывают сообщение об ошибке:
§3.3.1/4
Учитывая набор объявлений в одной декларативной области,...
[Примечание. Эти ограничения применяются к декларативной области, в которую вводится имя, которое не обязательно совпадает с регионом в котором происходит декларация. В частности, спецификаторы специфицированных типов (7.1.6.3) и декларации друзей (11.3) может ввести (возможно, не видимое) имя в Пространство имен; эти ограничения распространяются на этот регион. Местный внешний декларации (3.5) могут ввести название в декларативный регион где появляется декларация, а также ввести (возможно, не видимое) в закрытое пространство имен; эти ограничения применяются к оба региона. -end note]
§3.3.2/10
[Примечание: объявления друзей относятся к функциям или классам, которые членов ближайшего охватывающего пространства имен, но они не вводят новые имена в это пространство имен (7.3.1.2). Объявление функций на область блока и объявления переменных с помощью спецификатора extern в области блока относятся к объявлениям, которые являются членами охватывающего пространства имен, но они не вводят новые имена в эту область. -конец примечание]