宏包括循环作为表达式?

时间:2014-10-08 00:55:33

标签: c++ c macros

我使用了许多实现常见循环操作的宏。例如:

#define findIdx(count, cond, out) out = count; for (int i = 0; i < count; i++)  \
                                                  if (cond) out= i;

用过:

int arr[5] = {1, 12, 13, 19, 21};
int idx;
findIdx(5, arr[i] == 13, idx); //idx is set to 2

是否有一种聪明的方法可以将此功能作为表达式实现,而不会牺牲方便性,并且不使用c ++ 11(我不可用)?这样我可以直接将结果赋值给变量,或者将结果用作函数的参数?

1 个答案:

答案 0 :(得分:0)

在表达式中嵌入一个语句:

  • 您可以使用GCC statement expression

  • 您可以使用Clang Block

  • 在C ++ 03中,您可以在表达式中使用匿名结构的静态成员(或者至少g ++不会抱怨):

    foo(
        ((struct { static void f() { return; } }){}).f
    );
    

    (因此宏会将循环代码放在f的主体中)

在符合标准的C,任何版本(没有Greenspunning)中都无法做到这一点。该标准明确禁止在逗号表达式中使用setjmp,否则这是您可能会考虑的第一件事。