2017-02-21 4 views
7

[basic.link]/6 (내 emphasiss는)왜 아래 예제에서 'extern'지정자를 사용하겠습니까?

블록 범위에서 선언 된 함수의 이름과 블록 범위 통근 선언 선언 변수 이름은 결합있다. ...

static void f(); 
static int i = 0; 

void g() { 
    extern void f(); // internal linkage 
    int i; // #2 i has no linkage 
    { 
     extern void f(); // internal linkage <-- 
     extern int i; // #3 external linkage 
    } 
} 

[basic.link]/7 :
...

namespace X { 
    void p() { 
     q(); // error: q not yet declared 
     extern void q(); // q is a member of namespace X <-- 
    } 
    void middle() { 
     q(); // error: q not yet declared 
    } 
    void q() { /* ... */ } // definition of X::q 
} 
void q() { /* ... */ } // some other, unrelated q 

화살표가 가리키는 extern 지시자는 첫 번째 문장 단락 [basic.link]/6으로 표시 주어진 불필요 위의 굵은 글씨로 나타납니다. 나는 무엇인가 놓치고 있습니까?

+0

@ShafikYaghmour 이는 함수가 아니라 변수를 나타냅니다. – Barry

답변

1

externextern가 (때문에 그 단락에 설명 된 규칙에) 특정 상황에서 아무런 효과가 없다고 지적 각각의 의견을 강조 거기에 있습니다. 첫 번째 예

, f은 먼저 공간 범위 내에서 선언 static 때문에가 extern 선언에도 불구하고 내부 링크 있다. q도없이 공간 범위에서 선언 (및 X::q::q보다 우선) 때문에 제 exmaple에서

, extern는 선언에 영향을 미치지 않는다.

1

예를 들어 그럴듯한 생각이지만 잘못된 아이디어가 떠오를 것으로 생각합니다. 제 6 일에서

extern가 "보통"(즉 파일 범위)의 의미이기 때문에 f()외부 연결을 가지고 기대할 수 있지만, 추가로 최대 사실 때문에 static 선언의 내부 연결합니다. 단락에서

7 누군가가 middle() 호출 할 수 있도록,의 (또는 느슨한 음성 외부에에) p()q() 외부에서 사용할 수 있도록 extern void q();을 예상 할 수 있지만, 그 중 하나가 발생하지 않습니다.

두 키워드 모두 extern 키워드가없는 경우에도 여전히 유효하지만, extern이 다른 것을 의미한다고 예상하는 사람들에게는 놀라운 것이 아닙니다.

관련 문제