CII Chap 04中,对于RETURN的宏定义是:
#define RETURN switch(Exception_stack = Exception_stack->prev, 0) default: return
放在如下的代码中:
TRY
/* do something */
if (failed)
RETURN 1;
EXCETPT(Allocation_Failed)
/* Handle allocation fail */
END_TRY
展开之后就是:(暂不考虑TRY的宏定义)
TRY
/* ... */
if (failed)
switch(Exception_stack = Exception_stack->prev, 0)
default:
return 1;
EXCEPT(Allocation_Failed)
...
END_TRY
可以看到,这个宏的唯一目的,就是在return 1之前,执行Exception_stack = Exception_stack->prev语句。
仔细考虑之后可以发现,C语言中其他的结构都不能满足这一条件。如果使用
#define RETURN if(Exception_stack = Exception_stack->prev, 1) return
则在
if (...)
RETURN 1;
else
...
语句中,会导致else的误匹配。
我想到的唯一一个功能相同的语言结构是:
#define RETURN (Exception_stack = Exception_stack->prev, 0) ((void)0) : return