包含循环作为表达式的宏

Macro including loop as an expression?

本文关键字:表达式 循环 包含      更新时间:2023-10-16

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

#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(我不可用)的情况下将此功能作为表达式来实现?这样我就可以直接将结果分配给变量,或者将结果用作函数的参数?

在表达式中嵌入语句:

  • 您可以使用GCC语句表达式

  • 你可以使用Clang Block

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

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

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

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