条件中的goto标签技巧

时间:2015-05-11 23:11:30

标签: c if-statement macros goto c89

有一个我不记得的邪恶的宏伎俩,它很像这样:

public :
var = 3;
}

哪个应该扩展到

if(route == ROOTING_PUBLIC)
{
    var = 3;
}

我怎样才能达到这样的目标?

2 个答案:

答案 0 :(得分:3)

宏用于减少混乱;虽然很多杂乱表明程序结构存在问题。

OP的可能宏的概念与C语法不匹配。但是沿着这些方向可能是:

#define if_ROOTED(name) if (ROOTED_##name & input) { output = e##name; }

#define ROOTED_FIRST 16
#define ROOTED_SECOND 64

#define eFIRST 1
#define eSECOND 2

    if_ROOTED(FIRST);
    if_ROOTED(SECOND);

其中输入输出,重复测试是要消除的“混乱”。制作桌子是减少混乱的更好方法;但是OP要求提供有关宏的提示。

答案 1 :(得分:1)

现在我发现了这个坏主意的实现,我也能理解其中的深层意义。

代码

#define public if(route == ROOTING_PUBLIC) { public_offset

用法

public :
    var = 3;
} // <-- makes no sense

想法

避免循环,减少意大利面条代码并展示更多异国情调的代码。最好用id系统实现:

#define public(id) if(route == ROOTING_PUBLIC) { public_##id

然后,如果用户决定循环代码(通过语义将仅调用&#34;公开&#34;)

public(2) :
    var = 3;
    if(var > 3) goto public_2; // or #define repeat(x, id) goto x##_##id
}

更好的版本将包括省略幻数,将其替换为user_id