2016-07-26 10 views
2

C++에서 extern (언어 연결 문자열 리터럴 다음에 오지 않음)은 네임 스페이스 범위 (Difference between declaration of function with extern and without it)에서 함수 선언에 차이가 없음을 나타냅니다. 그러나 블록 범위 함수 선언에 어떤 영향을 미칩니 까? 또는 extern이없는 로컬 함수 선언은 항상 extern 인 것과 같습니다.extern과 함께 함수의 로컬/블록 범위 선언 차이점

namespace { 
    void f() { 
    extern void g(); // has external linkage 
    g(); 
    } 
    void f2() { 
    void g();  // always the same, as if, without extern 
    g(); 
    } 
} 

고마워요!

+0

왜 함수 내에 함수를 선언하겠습니까? 그게 뭐라고 생각하니? –

+0

extern의 반대는 정적입니다. - static void g(); // 내부 연계 '. –

+0

@underscore_d 체크 아웃 http://stackoverflow.com/questions/1034606/is-there-any-use-for-local-function-declarations – EulersRainbow

답변

2

규칙을에서 오는 것입니다 [ basic.link] :

블록 범위로 선언 된 함수의 이름과 블록 범위로 선언 된 변수의 이름 extern 선언에 링키지가 있습니다. 동일한 이름을 가진 링크가있는 엔티티와 유형의 선언이있는 경우, 블록 범위 선언 은 동일한 엔티티를 선언하고 이전 선언의 연결을 수신합니다. 일치하는 엔티티가 둘 이상인 경우 프로그램이 잘못 구성됩니다. 일치하는 엔티티가 없으면 블록 범위 엔티티 이 외부 연결을 수신합니다.

external을 포함하거나 포함하지 않는 블록 범위 함수 선언에는 차이가 없습니다. 블록 범위를 여기 f redeclares는 ::f

static void f(); 

void g() { 
    extern void f(); // internal linkage 
} 

와 같은 링크 수신 : 그러나 흥미로운 예를 참고 내부. 비록 그것은 extern이라고 표시되어 있습니다. 그러나 extern 키워드 부재의 존재는 중요하지 않습니다.

1

함수에 extern 지정자가 있는지 여부는 외부 연결 (명시 적으로 내부 연결이 있다고 선언되지 않은 경우)이 있는지 여부를 지정합니다.

그러나 로컬 함수 선언은 외부 범위에서 같은 이름을 가진 다른 함수 선언을 숨길 수 있습니다.

은 다음과 실증 프로그램을 고려

#include <iostream> 

void f(int) { std::cout << "F(int)" << std::endl; } 
void f(short) { std::cout << "f(short)" << std::endl; } 

int main() 
{ 
    void f(short); 

    f(10); 

    return 0; 
} 

그것의 출력은 로컬 선언을 언급하는 경우

f(short) 

다음 출력이

F(int) 
여기
+0

이 답변은 지역 함수 선언에 extern의 존재 또는 부재가 중요한 시나리오가 있는지 여부에 대한 답변보다 지역 함수 선언의 사용을 강조한다고 생각합니다. 또는 나는 무엇인가 놓치고 있냐? 또한 C++ 표준에 대한 모든 언급은 높이 평가 될 것입니다. 감사! – EulersRainbow

+0

@EulersRainbow 함수 선언과 이름 확인이 모호한 일부 라이브러리에서 같은 이름의 함수 선언간에 충돌이있는 경우 로컬 선언이 유용 ​​할 수 있습니다. 표준에 대한 언급에 관해서는 유감스럽게도 표준 또는 그 초안을 직접 작성하지 않았습니다. –

+0

감사합니다. 나는 그들의 이익을 이해한다고 생각합니다 - 당신의 예는 지역 선언의 이점을 강조하는 훌륭한 일을합니다. 그러나 내가 더 관심있는 질문은 : C++ 표준을 기반으로, 로컬 함수 선언에 'extern'을 추가하면 진정으로 차이가 없다는 것입니다. – EulersRainbow