我有一个以下形式的结构:
struct foo {
bool has_value;
int value;
}
Run Code Online (Sandbox Code Playgroud)
我想创建一个宏,它可以用来赋值,如下所示:
ASSIGN(foo) = 0;
or
ASSIGN(foo) += 5;
Run Code Online (Sandbox Code Playgroud)
当宏为:
#define ASSIGN(s) \
s->has_value = true; s->value
Run Code Online (Sandbox Code Playgroud)
然而,宏并不安全。在下面的示例中,if将“吃掉”宏的第一部分ASSIGN。
if (cond)
ASSIGN(foo) += 5;
Run Code Online (Sandbox Code Playgroud)
关于如何确保安全有什么建议ASSIGN 吗?
使用逗号运算符,并放入括号以方便测量。
#define ASSIGN(s) \
((s)->has_value = true), (s)->value
Run Code Online (Sandbox Code Playgroud)
在 if 语句中它将扩展为:
if (cond)
((foo)->has_value = true), (foo)->value += 5;
Run Code Online (Sandbox Code Playgroud)
然而,这种用法中的宏是一个非常糟糕的主意。
您几乎总能想出会破坏宏的滥用代码。
即使它有效,它也会让未来可能阅读你的代码的程序员感到困惑。
ASSIGN(foo) = M_PI;
printf("Sin of PI/2 = %f\n", sin(ASSIGN(foo) *= 0.5));
Run Code Online (Sandbox Code Playgroud)
您可能希望打印出来1。
它甚至可能无法编译。