接受此代码:
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上编译得很好,它不会导致错误或警告。在第一个视图..它的工作原理。 但正如你自己可以看到的......它看起来真的很可疑。
这是我正确的做法吗?
请问您是否有理解的事情。
答案 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_TERMINAL
和STATIC_TERMINAL
,而不是键出一个宏参数。
#define LOCAL_TERMINAL (x) checksum terminal_##x = DENY
#define STATIC_TERMINAL(x) static checksum terminal_##x = ALLOW