复杂的单行条件校验和定义

时间:2014-10-30 21:09:34

标签: c macros c-preprocessor stringification

接受此代码:

typedef enum CHECKSUM { DENY = 0, ALLOW = 1 } checksum;
#define terminal(x, str) static checksum* terminal_##x; { if(!strcmp(#str, "static")) { static checksum local = ALLOW; terminal_##x = &local; } else { checksum local = DENY; terminal_##x = &local; }  }

我想要的代码是定义一个宏函数,其中两个参数x用于名称,str用于特定类型。宏函数声明static checksum*,其名称terminal_与名称x连接在一起。然后,它会打开一个新范围并对特定类型str进行字符串化,并使用strcmp检查它是否等于static。如果是这样..然后它声明一个变量类型static checksum,用ALLOW初始化并使声明的指针指向它,如果它不相等则它声明一个变量类型checksum,用DENY初始化并将指针设置为指向它。 然后我们可以这样调用宏:

int main(void)
{
    int i = 0;

    while(*terminal_name == ALLOW) { terminal(name, static) if(i > 200) { *terminal_name = DENY; } i++; }

    return 0;
    // Note that this is only an example usage. The real usage of this is far more long and complicated.
}

代码在C89上编译得很好,它不会导致错误或警告。在第一个视图..它的工作原理。 但正如你自己可以看到的......它看起来真的很可疑。

这是我正确的做法吗?

请问您是否有理解的事情。

1 个答案:

答案 0 :(得分:0)

在不了解您的计划的情况下,很难说这个宏是合理还是坏主意。

从风格上讲,您可以使用反斜杠将宏分割成多行。这将使它更具可读性,更少可疑"。

#define terminal(x, str)                   \
    static checksum* terminal_##x;         \
    {                                      \
        if (!strcmp(#str, "static")) {     \
            static checksum local = ALLOW; \
            terminal_##x = &local;         \
        }                                  \
        else {                             \
            checksum local = DENY;         \
            terminal_##x = &local;         \
        }                                  \
    }

使用strcmp来决定是否使用static或者不是以错误的方式使用我。这是影响编译时决策的运行时检查。我建议制作两个单独的宏,比如说LOCAL_TERMINALSTATIC_TERMINAL,而不是键出一个宏参数。

#define LOCAL_TERMINAL (x)        checksum terminal_##x = DENY
#define STATIC_TERMINAL(x) static checksum terminal_##x = ALLOW