C++ 如何获取有关旧异常规范的警告

C++ 如何获取有关旧异常规范的警告,c++,c++11,g++4.8,exception-specification,C++,C++11,G++4.8,Exception Specification,我知道,在其他方面(比如auto_ptr),异常规范在C++11中已经被弃用 有没有办法用下面的代码从g++4.8获得警告 struct F{ void foo() throw (int){} }; int main() { } 我已经尝试了-Wall-pedantic-Wextra-Wdeprecated声明,但没有成功。您可以使用 class __attribute__((deprecated)) old_style_throw_specification; class old_s

我知道,在其他方面(比如auto_ptr),异常规范在C++11中已经被弃用

有没有办法用下面的代码从g++4.8获得警告

struct F{
    void foo() throw (int){}
};
int main()
{
}
我已经尝试了-Wall-pedantic-Wextra-Wdeprecated声明,但没有成功。

您可以使用

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

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

或者,如果您需要支持空抛出规范(感谢@John5342指出这一点),您可以使用

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

#define throw(...) throw(old_style_throw_specification, __VA_ARGS__)
#define throw(...) throw(old_style_throw_specification, ##__VA_ARGS__)
对于宏,但您需要使用GNU扩展进行编译:
-std=GNU++11
,因为上面的内容在C++11中并不严格合法


我得到错误:在“throw”之前应该是初始值设定项。它似乎有点形式不正确。此外,我希望避免使用宏。我正在处理的旧代码中已经充满了令人讨厌的宏。@Davidbrcz已修复,现在应该可以工作了。(好的,仍然是宏)不确定这是否适用于空的异常列表(将有一个额外的逗号)。我认为gcc对此有一个扩展,我认为是“throw(旧的_样式_throw_规范,###(旧的)(旧的)(旧的)(旧的)(旧的)(样式)()(旧的)()。感谢您指出空掷规范的问题,我更新了答案。