C 中带有 break 或 continue 语句的 foreach 宏
A foreach macro with a break or continue statement in C
我的代码有几个循环,所有循环都检查条件是否为真。
for(int i = 0; i < size; i++) {
if (check_conditition(array[i]))
break;
// do something
}
所以我想把它包装在一个宏上,这样我就不必在所有宏上都包含 check_conditition()
,例如:
for_each_item(i, array) {
// do something
}
我该怎么做?或者有更好的选择吗?
要在宏中包含 check_condition
,您可以将其添加到 for
循环条件中:
#define for_each_item(idx, array) for (int idx=0; \
(idx<size) && !check_condition(array[idx]); \
idx++)
现在您可以按照您的要求使用宏了:
for_each_item(i, array)
{
// do something
}
P.S。您可以将 size
替换为 sizeof(array)/sizeof(array[0])
:
#define for_each_item(idx, array) for (int idx=0; \
(idx<(sizeof(array)/sizeof(array[0]))) && \
!check_condition(array[idx]); \
idx++)
你可以这样做:
#include <stdio.h>
#define foreach(x, size, array) for( x = 0; x < size; x++) {\
if (check_conditition(array[x]))\
break;
#define endforeach }
int check_conditition(int a){ return 0;}
int main(int argc, char *argv[])
{
int i = 0;
int size = 10;
int array[10] = {1,2,3,4,5,6,7,8,9,10};
foreach(i, size, array)
printf("%d", array[i]);
endforeach
return 0;
}
我的代码有几个循环,所有循环都检查条件是否为真。
for(int i = 0; i < size; i++) {
if (check_conditition(array[i]))
break;
// do something
}
所以我想把它包装在一个宏上,这样我就不必在所有宏上都包含 check_conditition()
,例如:
for_each_item(i, array) {
// do something
}
我该怎么做?或者有更好的选择吗?
要在宏中包含 check_condition
,您可以将其添加到 for
循环条件中:
#define for_each_item(idx, array) for (int idx=0; \
(idx<size) && !check_condition(array[idx]); \
idx++)
现在您可以按照您的要求使用宏了:
for_each_item(i, array)
{
// do something
}
P.S。您可以将 size
替换为 sizeof(array)/sizeof(array[0])
:
#define for_each_item(idx, array) for (int idx=0; \
(idx<(sizeof(array)/sizeof(array[0]))) && \
!check_condition(array[idx]); \
idx++)
你可以这样做:
#include <stdio.h>
#define foreach(x, size, array) for( x = 0; x < size; x++) {\
if (check_conditition(array[x]))\
break;
#define endforeach }
int check_conditition(int a){ return 0;}
int main(int argc, char *argv[])
{
int i = 0;
int size = 10;
int array[10] = {1,2,3,4,5,6,7,8,9,10};
foreach(i, size, array)
printf("%d", array[i]);
endforeach
return 0;
}