使用了非标准扩展:“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. {
  4. public:
  5. A() {printf(" 构造一个 A 对象 n");}
  6. ~A() {printf(" 析构一个 A 对象 n");}
  7. void f1() {}
  8. void f2() {}
  9. };
  10. void main()
  11. {
  12. __try
  13. {
  14. A a1, a2;
  15. puts("in try");
  16. } __except(puts("in filter 1"), 1)
  17. {
  18. puts("in except 1");
  19. }
  20. }

编辑结果:
1>c:\users\junliang-aya\documents\visual studio 2008\projects\test\test\main.cpp(18) : warning C4509: 使用了非标准扩展:“main”使用 SEH,并且“a2”有析构函数
1>        c:\users\junliang-aya\documents\visual studio 2008\projects\test\test\main.cpp(16) : 参见“a2”的声明
1>c:\users\junliang-aya\documents\visual studio 2008\projects\test\test\main.cpp(18) : warning C4509: 使用了非标准扩展:“main”使用 SEH,并且“a1”有析构函数
1>        c:\users\junliang-aya\documents\visual studio 2008\projects\test\test\main.cpp(16) : 参见“a1”的声明
1>c:\users\junliang-aya\documents\visual studio 2008\projects\test\test\main.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

时间: 2024-10-08 17:06:36

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

[Effective JavaScript 笔记]第29条:避免使用非标准的栈检查属性

许多js环境都提供检查调用栈的功能.调用栈是指当前正在执行的活动函数链.在某些旧的宿主环境中,每个arguments对象含有两个额外的属性:arguments.callee和arguments.caller.前者指向使用该arguments对象被调用的函数.后者指向调用该arguments对象被调用的函数的函数.许多环境支持arguments.callee,但它除了允许匿名函数递归地引用自身之外,没有更多的用途了.(高3中认为使用arguments.callee可以解除函数体内的代码和函数名之间

找出并打印window非原生扩展属性 windowExtendAttr.js

supme 找出并打印window非原生扩展属性 windowExtendAttr.js window扩展属性,扩展方法,扩展函数,非原生属性,非原生方法,非原生函数 http://owmivsi48.bkt.clouddn.com/windowExtendAttr.js // windowExtendAttr.js (function() { var iframe = document.createElement("iframe"); document.body.appendChil

[Q]非标准图纸(加长图)的打印时如何自定纸张尺寸

问:当打印机纸张列表里没有符合要求的纸张大小,例如如何打印加长图?答:当打印非标准图框时,你可能在图纸列表里找不到想要纸幅.你需要自己新建你需要的纸幅,以pdfFactory虚拟打印机为例(其它打印机类似):在“控制面板”>“打印机和传真”>“pdfFactory Pro”>“打印首选项”>“自定义”下设置自定义纸张名称和大小,修改后需关闭AutoCAD后重新打开即可,如下图所示:

2.非标准的NDEF格式数据解析--IsoDep

1.使用目的:正常开发是针对NDEF格式数据进行开发,但实际情况并非如此,以厦门公交卡为例,厦门公交卡保存的是非NDEF格式数据.其类型是IsoDep类型. 2.非标准的NDEF格式数据流程:当厦门公交卡放到NFC上时,手机会捕获该厦门公交卡标签信息,其中标签的数据将封装到Intent中,并启动相关的Activity处理该标签信息,判断该标签类型为IsoDep类型后,使用该IsoDep类对标签进行操作. NFC针对非标准的NDEF格式数据使用步骤: 1.获取NFC权限/添加Intent过滤器 2

非标准武术擂台1V1机器人示例程序

/******************************************************************* ** 文件名:擂台赛非标准平台1V1程序_检测原理AVR单片机示例程序,详细资料请购买产品后索要 ** Copyright (c) KXCT雷電科技 技术部 ** 创建人:KXCT ** 日 期:2015年11月 ** 修改人: ** 日 期: ** 描 述:仅供参考,擂台机器人调试能用的程序,包含了上台.边缘检测.推棋子.检测对手等功能 ** 版 本:V1.

Wireshark分析非标准端口号流量

Wireshark分析非标准端口号流量 2.2.2  分析非标准端口号流量Wireshark分析非标准端口号流量 应用程序运行使用非标准端口号总是网络分析专家最关注的.关注该应用程序是否有意涉及使用非标准端口,或暗中想要尝试通过防火墙本文选自WireShark数据包分析实战详解清华大学出版社. 1.分配给另一个程序的端口号 当某数据包使用非标准端口上,如果被Wireshark识别出是使用另一个程序,则说明Wireshark可能使用了错误的分析器,如图2.19所示本文选自WireShark数据包分

转 在无法通过yum下载非标准包时,怎么办

在CentOS下,我们可以通过yum来下载或更新rpm包,但是标准的源(repository)里只提供一部分的rpm包,虽然大部分情况下,这些包是够用的.但是有时候还是需要下载其他的一些非标准的包,如qemu,不然的话用户只能自己去编译对应的包,而这个可能并不是每个用户都乐意去做的.下面的网站就提供了对应的额外包的安装.http://repoforge.org/RepoForge项目给以下项目维护RPM包: Red Hat Enterprise Linux (RHEL) CentOS Scien

计件类型整合件数,包装规格,标准重量,非标准重量

标准件和非标准件入库和出库的件数,规格,重量记录方案标准件入库:只需填写包装规格和总重量,自动计算入库件数,入库的标准袋重量和非标准袋重量:数据存入入库单表和库存快照表非标准件入库:只需填写件数和总重量,包装规格无需填写,自动计算标准重量为0,非标准件重量等于总重量:数据存入入库单表和库存快照表标准件出库:只需填写出库总重量,包装规格自动从入库单带出,剩余标准重量和剩余非标准重量自动带出,件数自动计算,标准重量自动计算,非标准重量自动计算:出库量小于非标准重量则直接从非标准重量出库,出库量大于剩

用 #include “filename.h” 格式来引用非标准库的头文件

用 #include "filename.h" 格式来引用非标准库的头文件(编译器将 从用户的工作目录开始搜索) 1 #include <iostream> 2 3 /* run this program using the console pauser or add your own getch, system("pause") or input loop */ 4 using namespace std; 5 //参数带有默认值的函数 6 disp(