使用了非标准扩展:“xxx”使用 SEH,并且“xxx”有析构函数

46 篇文章 2 订阅

使用了非标准扩展:“xxx”使用 SEH,并且“xxx”有析构函数

如果一个函数内使用了异常处理机制, VC 编译器在编译该函数时,它会给此函数插入一些“代码和信息”(代码指的是当该函数中出现异常时的回调函数,而信息主要是指与异常出现相关的一些必要的链表),因此每份函数只能有一份这样的东东(“代码和信息”),故一个函数只能采用一种形式的异常处理规则。


\

上图中黄色部分就是新添加的异常信息,通过stack unwinding来实现局部变量的析构函数自动调用。所以在析构函数中不能抛出异常(http://publib.boulder.ibm.com/infocenter/lnxpcomp/v8v101/index.jsp?topic=%2Fcom.ibm.xlcpp8l.doc%2Flanguage%2Fref%2Fcplr155.htm)
具体的异常信息分析见参考url.


/**************/
干货2
/**************/
好,你以为你理解了么,那么看下面的例子:
  1. #include <stdio.h>
  2. class A 
  3. public: 
  4.     A() {printf(" 构造一个 A 对象 n");} 
  5.     ~A() {printf(" 析构一个 A 对象 n");} 
  6.     void f1() {} 
  7.     void f2() {} 
  8. }; 
  9. void main() 
  10.     __try 
  11.     { 
  12.         A a1, a2; 
  13.         puts("in try"); 
  14.     } __except(puts("in filter 1"), 1) 
  15.     { 
  16.         puts("in except 1"); 
  17.     } 
  18. }

编辑结果:
1>c:usersjunliang-ayadocumentsvisual studio 2008projectstesttestmain.cpp(18) : warning C4509: 使用了非标准扩展:“main”使用 SEH,并且“a2”有析构函数
1>        c:usersjunliang-ayadocumentsvisual studio 2008projectstesttestmain.cpp(16) : 参见“a2”的声明
1>c:usersjunliang-ayadocumentsvisual studio 2008projectstesttestmain.cpp(18) : warning C4509: 使用了非标准扩展:“main”使用 SEH,并且“a1”有析构函数
1>        c:usersjunliang-ayadocumentsvisual studio 2008projectstesttestmain.cpp(16) : 参见“a1”的声明
1>c:usersjunliang-ayadocumentsvisual studio 2008projectstesttestmain.cpp(22) : error C2712: 无法在要求对象展开的函数中使用 __try

why?

因为只要有局部对象存在,就一定会存在c++异常处理机制try/catch,而你又调用__try/__except, 一个函数中只能有一种异常处理机制,所以出错。

参考:
http://baiy.cn/doc/cpp/inside_exception.htm
http://blog.pfan.cn/mroske/9865.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值