C 宏赋值

dim*_*mba 3 c macros

我有一个以下形式的结构:

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

abe*_*nky 5

使用逗号运算符,并放入括号以方便测量。

#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
它甚至可能无法编译。