我可以创建一个有条件的goto并用作表达式的宏吗?

时间:2019-04-18 11:35:22

标签: c macros c-preprocessor

是否可以创建一个宏来扩展以下代码

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

0 个答案:

没有答案