2014-04-08 5 views
1

(auto_ptr과 같은) 다른 예외 중에서 C++ 11에서는 예외 사양이 더 이상 사용되지 않습니다.이전 예외 사양에 대한 경고를 얻는 방법

g ++ 4.8에서 다음 코드로 경고를받을 수있는 방법이 있습니까?

struct F{ 
    void foo() throw (int){} 
}; 
int main() 
{ 
} 

이미 -Wall -pedantic -Wextra -Wdeprecated-선언로했지만, 어떤 성공없이.

답변

3

당신은

class __attribute__((deprecated)) old_style_throw_specification; 
class old_style_throw_specification {}; 

#define throw(...) throw(old_style_throw_specification, __VA_ARGS__) 

Live example

를 사용하거나 (이 지적에 대해 John5342 @ 덕분에) 빈 던져 사양을 지원해야하는 경우, 당신은에 대한

#define throw(...) throw(old_style_throw_specification, ##__VA_ARGS__) 

을 사용할 수 있습니다 GNU 확장으로 컴파일해야합니다 : -std=gnu++11 위와 같이 엄격하게 C++ 11은 합법적이지 않습니다.

Live example

+0

오류가 발생합니다. 'throw'이전에 예상되는 초기화 프로그램입니다. 그것은 어쨌든 부적절한 것으로 보인다. 또한 나는 매크로를 피하고 싶다. Im에서 작업중인 레거시 코드는 이미 불쾌한 매크로로 가득 차 있습니다. – Davidbrcz

+0

@Davidbrcz 수정 되었으니 이제 사용해야합니다. (그래, 여전히 매크로) –

+0

이것은 빈 예외 목록 (추가 쉼표가있을 것입니다)에서 작동하는지 확신 할 수 없습니다. gcc는 __VA_ARGS__이 비어 있으면 gcc가 여분의 쉼표를 제거하는 'throw (old_style_throw_specification, ## __ VA_ARGS__)'을 실행하는 것으로 생각합니다. – John5342