2013-02-19 2 views
6

의 실현에 호환되지 않으며 그 소리는 잘 컴파일합니다. 그러나, 표준 등의 단락이있다 :예외 사양 우리는 코드를</p> <pre><code>int main() { void f() throw(int); f(); return 0; } void f() { } </code></pre> <p>GCC를 다음 한 선언과 기능

n3376 15.4/4

함수의 선언 모든 예외, 모든 선언을 허용하는 noexcept-사양이 아닌 예외 사양이있는 경우, 그 함수의 정의 및 명시 적 전문화를 포함하여, 호환 예외 규정을 가져야한다.

그리고 다음과 같은 예를 들어

: GCC - 오류가 연타 -

void f() throw(int); 

int main() 
{ 
    f(); 
    return 0; 
} 

void f() { } 

을 경고하는 이유는이 조각에서 차이가? 감사.

+0

다른 함수 내에서 선언 된 함수도 같은 이름의 함수 정의를 외부에서 참조합니까? 다른 함수 안에 함수를 선언한다는 것은 무엇을 의미합니까? – jogojapan

+0

@ jogojapan,이 경우에 대해서는 표준에서 아무것도 찾을 수 없습니다. 그러나 어쨌든 여기에 정의되지 않은 참조가 없습니다. http://liveworkspace.org/code/3BA8in$0 undef ref가 있습니다. – ForEveR

+4

예,하지만 (컴파일러 문제 일지라도) 문제는 예외 사양 처리와 관련이 없습니다. 예를 들어'f'를'main' 내부에'int'를 반환하는 것으로 선언하지만'main' 외부에서는'void'를 반환하는 것으로 선언하면 여전히 컴파일됩니다. 비록 당신이'f'를 호출하고 주장 된 반환 값을 사용한다 할지라도. 적어도 g ++ 및 clang과 관련하여 : http://liveworkspace.org/code/2l5YiJ$1 흥미롭게도 Intel 컴파일러는 경고를 발행합니다. – jogojapan

답변

2

표준의 n3376 15.4/4는 함수의 모든 데 j 레이션과 정의가 동일한 유형을 가져야 함을 지정합니다. 여기 :

void f() throw(int); 
int main() 
{ 
    f(); 
    return 0; 
} 

void f() { } 

선언 void f() throw(int); 및 정의 void f() { } 글로벌 SCOP에 있습니다. 선언은 throw 사양이없는 함수에 대한 정의 인 동안 int를 throw하는 함수에 대한 선언이기 때문에 충돌이 발생합니다.

이제 주 스코프에 선언을 넣으면 정의가 동일한 범위에 있지 않습니다.이 범위에서는 정의를 알 수 없으므로 컴파일 할 수 있습니다.

당신이 내 영어를 이해 하셨기를 바랍니다. 죄송합니다.

+0

사실이 아니지만 받아 들여집니다. 실제 clang이 이제이 경우를 처리하지만 경고 만 표시됩니다. http://melpon.org/wandbox/permlink/z6JcuiyJm7y87PXD – ForEveR

관련 문제