2012-02-06 1 views
2

개체 참조를 반환하는 일부 멤버 함수에 __declspec(nothrow)을 적용하고 싶습니다. 예를 들어, 나는 (에서 MyClass.h에서)이 기능에 추가하고 싶습니다 :참조를 반환하는 함수에서 __declspec (nothrow) 사용

CMyClass& operator= (IN UInt32 nValue) 
{ 
    return (SetValue (nValue)); 
}; 

내가 지금과 같은 함수의 반환 입력 한 후 추가해야 할 VC++ documentation says :

return-type __declspec(nothrow) [call-convention] function-name ([argument-list])

이렇게하면 대부분 내 기능이 __declspec(nothrow)과 잘 작동합니다. 내가 그 위의 멤버 함수 (또는 CMyClass&를 돌려 어떤 다른 사람)을 위해 할 때, 내가 컴파일 오류를 얻을 :

error C2059: syntax error : '__declspec(nothrow)'

내가 반환 형식 앞에 넣을 수 있으며, 그 다음 컴파일하지만, 설명서에서는 __declspec()이 잘못된 위치에 있으면 컴파일러가 경고 또는 오류없이 무시할 수 있다고 말합니다.

__declspec(nothrow)을 사용하는 올바른 방법은 무엇입니까?

+1

표준 준수의 'throw()'표시를 사용하지 않는 이유는 무엇입니까? –

+2

이것은 꽤 의미없는 운동입니다. MSVC 컴파일러는 * nothrow * 선언을 허용하지만 선언을 bs로 처리하는 실제 컴파일러 구현 그룹의 일부입니다. C++ 11에서 더 많은 크레딧을 받았지만 예외 사양은 더 이상 사용되지 않습니다. 새 키워드는 * noexcept *입니다. 귀찮게하지 마라. –

+1

글쎄, __declspec (nothrow)하는 동안 던져()도 noexcept VC++에서 작동하지 않습니다. – xxbbcc

답변

3

저는 믿습니다 (하지만 100 % 확신을하지 오전) 올바른 구문은 다음과 같습니다

CMyClass __declspec(nothrow) & operator= (IN UInt32 nValue) 

컴파일러가 간단 선언의 경우와 같이 함수 선언에 대해 동일한 규칙과 &을 따르는 것 같습니다 (또는 *)는 declspec 뒤에옵니다. 이는 MSDN documentation 중 일부와 일치합니다.

__declspec 키워드는 간단한 선언의 시작 부분에 있어야합니다. 컴파일러는 * 또는 & 뒤에 있고 선언의 변수 식별자 앞에 __declspec 키워드를 경고없이 무시합니다.

다른 사람들이 지적했듯이, 이것은 시간 낭비의 일부입니다. throw()에는 동일한 홀수 구문 분석 문제가 없으며 the documentation에는 해당 구문 분석 문제가 동일하다고 명시되어 있습니다.

는 다음 처리기 지시문 주어 세 함수 선언 이하 동일 :

#DEFINE의 WINAPI의 __declspec (nothrow) __stdcall

공극 WINAPI F1을();
void __declspec (nothrow) __stdcall f2();
void __stdcall f3() throw();

+0

답변을 주셔서 감사합니다. 나는 문서를 읽었지 만, 당신이 인용 한 부분이 달라 붙지 않았다고 생각합니다. 나는'throw()'와'_declspec (nothrow)'에 대해 동등한 어셈블러 출력을 얻는 지 볼 것이다. – xxbbcc