是否可以创建一个宏来扩展以下代码
int error = 0;
struct parse_tree res = CLEANUP_parse(file_hdl);
// ...
cleanup:
return error
在语义上等同于(足以)
int error = 0;
struct parse_tree res;
struct parse_tree tmp = parse(file_hdl);
if(global_error_variable != 0) {
error = global_error_variable;
goto cleanup;
} else {
res = tmp;
}
// ...
cleanup:
return error
我担心不可能的原因是goto label;
是一个语句,我真的需要一个表达式。例如。像
#define CLEANUP_parse(file_hdl) ((tmp=parse(file_hdl)) ^ tmp ^ global_error_variable) ? goto cleanup : tmp
由于该原因(以及未声明tmp
并且可能更多)而无法使用。
不幸的是,只有在GCC,VSC 和 Texas Instruments的C编译器支持它们的情况下,才可以进行编译器扩展。
我们有一个现有的代码库,其中每个函数返回一个整数错误代码,并且调用者在非零返回代码上跳至cleanup:
。我考虑引入使用全局错误代码的函数,以启用其返回值的使用,但希望以安全且向后兼容的方式进行操作。 The full picture on SE Code Review