__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提供try
和catch
,但我建议反对它们而不是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