__try和__exception可移植性

你好,请原谅我

我正在阅读英特尔的“检测IA-32架构中的多处理器拓扑”。 我正在记录这个例子。 但是我在代码中读到了__try和__except这句话。

我在MSDN Microsoft网页上找到了一些信息,但我使用的是gcc编译器/链接器

在gcc中是__try和__except有效句子吗? 在* nux环境中是__try和__except可移植句子吗? 对于C中的exception处理,是否存在比__try和__except句子更好的模式?

提前致谢。

一般考虑

根据MSDN , __try__except是C语言的扩展。 因此,它们不是便携式的。

对于某些应用程序,可以使用宏和setjmp / longjmp构造来模仿它们的行为。 一般情况下情况并非如此。 特别是,MSDN声明

__except表达式在__try主体的范围内执行。

单独使用宏无法实现。

你的问题

在gcc中是__try__except有效句子吗?

不,他们不是,因为gcc不支持这种微软方言C.

在* nux环境中是__try和__except可移植句子吗?

不,它们不是,尽管有很多方法可以在* nix上实现类似的exception处理。

对于C中的exception处理,是否存在比__try和__except句子更好的模式?

在进行exception处理时,有充分的理由使用C ++。 具有析构函数的C ++作用域对象在存在exception时比标准C资源管理更加健壮。 因此,虽然有一些实现为C提供trycatch ,但我建议反对它们而不是C ++。 C ++中的exception处理是标准的一部分,因此所有符合标准的编译器都支持,没有可移植性问题。

C标准没有exception处理支持。 C ++可以。 使用setjmp有许多try / catch实现。

__try和__except是(如Microsoft所述)C / C ++语言的扩展。 因此它在gcc中不可移植。 我认为微软把它们放在这里,以便纯C(不使用C ++编译器)可以有类似于exception处理的东西。 * S * tructured * E * xception * H * andling(SEH)是相当低级别的,据我所知,即使微软自己的C ++exception处理也使用了SEH。

我对整个事情的看法是,如果你看到__try和__except,只需用try和catch替换它,然后用C ++编译器编译。 您当然必须替换传递给__except的filter,但这不是什么大问题。

您可能想看看以下链接:

gcc.gnu.org/onlinedocs/libstdc++/manual/using_exceptions.html

http://www.autohotkey.com/community/viewtopic.php?t=31475