我使用了许多实现常见循环操作的宏。例如:
#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(我不可用)?这样我可以直接将结果赋值给变量,或者将结果用作函数的参数?
答案 0 :(得分:0)
在表达式中嵌入一个语句:
您可以使用Clang Block
在C ++ 03中,您可以在表达式中使用匿名结构的静态成员(或者至少g ++不会抱怨):
foo(
((struct { static void f() { return; } }){}).f
);
(因此宏会将循环代码放在f
的主体中)
在符合标准的C,任何版本(没有Greenspunning)中都无法做到这一点。该标准明确禁止在逗号表达式中使用setjmp
,否则这是您可能会考虑的第一件事。