연타, GCC 및 VS2013 모든 main()
에서 w
의 재정에 대해 불평하지만, 나는 이것을 허용하지 표준 아무것도 찾을 수 없습니다.사용
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 노트]
§3.3.2/10
[참고 : 친구의 선언은 기능 또는 가까운 바깥 쪽 네임 스페이스의 구성원 클래스를 참조하지만, 그들은 새 이름을 소개하지 않는다 그 네임 스페이스에 넣는다 (7.3.1.2). 블록 범위와 블록 범위에서 통근 지정자 변수 선언에서 함수 선언은 둘러싸 네임 스페이스의 멤버 선언을 참조하지만, 그 범위에 새로운 이름을 소개하지 않습니다. 라고 §3.3.1/3 표준에서 : : -end 참고 여기서
나는 그들이 * local scope *에 새로운 이름을 도입했다고 생각한다. 즉, 'extern int w;'는 일부 전역 변수를 참조하고 'int w;'는 로컬 범위의 새 객체를 정의합니다. 그래서 전역 변수를 가리키는'w'라는 이름과 지역 변수를 가리키는'w'라는 이름 사이에 충돌이 있습니다. – dyp
§3.3.2/10이 방금 쓴 내용과 반대되는 말을하지 않습니까? –
필자는 3.3.2/10을 "포함하는 네임 스페이스에 새 이름을 도입하지 않습니다"또는 "로컬 범위에 이름을 다시 도입하지만 * 새 * 이름을 입력하지 마십시오"로 해석합니다. – dyp