【问题标题】:goto label trick in a macro for condition条件宏中的 goto label 技巧
【发布时间】:2015-05-11 23:11:30
【问题描述】:

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

public :
var = 3;
}

应该扩展到

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

我怎样才能实现这样的目标?

【问题讨论】:

  • 嗯?你为什么还要关心这种粗俗(假设有可能)?
  • 我不认为这是粗俗。它对我来说看起来更干净,就像特定环境的加法一样。在我正在做的项目中..这肯定会很好地利用我以前见过的这个技巧。
  • 我想你会发现自己是少数,那么!让我们假设这是可能的(它不是)。您将隐藏控制流和语法范围,看起来完全不同。任何遇到此代码的人都会被完全误导。
  • 邪恶的宏把戏按定义是邪恶的。不要作恶。它可能看起来干净或聪明。如果您是唯一会接触到它的人,那很好。但如果它是为了别人的眼睛,你可能要考虑这样的邪恶代码可能会产生什么样的诅咒。
  • 没错,但我认为这还不是我在well..生活中遇到的最糟糕的C-reinventing。而且我觉得还是比较安全的。

标签: c if-statement macros goto c89


【解决方案1】:

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

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);

where inputoutput 以及重复测试是要消除的“混乱”。制作一张桌子将是减少混乱的更好方法;但是 OP 要求提供有关宏的提示。

【讨论】:

    【解决方案2】:

    现在我发现了这么糟糕的想法的实现,我也能理解它的深层含义了。


    代码

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

    用法

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

    想法

    为了避免循环,减少意大利面条式代码并展示更多奇特的代码。最好用这样的 id 系统来实现:

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

    然后,如果用户决定循环代码(按语义将单独“公开”调用):

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

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

    【讨论】:

    • 在宏中放一个“{”的一个缺点是它会阻止您使用文本编辑器检查花括号的平衡。
    • 事实上是的。括号匹配功能在那个上会很混乱。
    • switch 语句将更具可读性,并且不需要宏混淆。
    • 回到 c89 之前,我使用的编译器在宏中接受了不平衡的 "
    • @wallyk 我愿意接受更有效的解决方案来坚持这个想法。
    猜你喜欢
    • 2011-07-18
    • 1970-01-01
    • 2021-04-05
    • 2022-08-18
    • 1970-01-01
    • 1970-01-01
    • 2023-04-01
    • 1970-01-01
    • 2010-09-13
    相关资源
    最近更新 更多