gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 20:39:24 25 4
gpt4 key购买 nike

使用此代码:

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 上编译良好,不会导致任何错误或警告。第一眼看上去……它有效。但正如你亲眼所见......它看起来真的很可疑。

这是我正确的做法吗?

如果您在理解某些内容时遇到困难,请询问。

最佳答案

在不了解您的程序的更多信息的情况下,很难判断该宏是合理还是坏主意。

从风格上来说,您可以使用反斜杠将宏分成多行。这将使它更具可读性并且更少“可疑”。

#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

关于复杂的单行条件校验和定义,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26663350/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com