C 宏 运行 范围内的循环

C macro to run a loop over a range

我有一个包含 10 个元素的 数组。将对该元素调用 任意函数

每个任意函数都可以

  1. 对单个元素进行操作,或者
  2. 相同的函数将作用于所有元素。

我有多种功能遵循这种模式。

我正在尝试这样做:

#define ITERATE_ALL10(IDX) (##IDX = 0; ##IDX < 10; ##IDX++)

int arbitrary_fx(int *some_arr, int id) {
    int i;

    if (id == ID_ALL) {
        for (ITERATE_ALL10(i)) {
            arbitrary_fx_helper(some_arr[id]);
        }
    }
    else {
        arbitrary_fx_helper(some_arr[id]);
    }
}

我不知道如何修复错误:

expected ';' before ')' token

expected expression before ')' token

我做错了什么?有没有更好的方法来实现我想要的?

您的代码中有两个错误。

首先,您错误地使用了令牌粘贴运算符##。此运算符用于粘贴两个令牌以制作一个新令牌,例如foo ## bar 产生 foobar。您的代码中不需要它,只需将其删除即可。

解决此问题后,您的宏如下所示:

#define ITERATE_ALL10(IDX) (IDX = 0; IDX < 10; IDX++)

这是展开的样子:

for ((i = 0; i < 10; i++)) {

请注意,有一对多余的括号,这是编译器无法处理的。要么从宏定义中删除括号:

#define ITERATE_ALL10(IDX) IDX = 0; IDX < 10; IDX++

或从宏调用中删除括号:

for ITERATE_ALL10(i)

我更喜欢前者。

要么从宏定义中删除括号,要么从宏调用周围删除括号。您还需要删除标记粘贴运算符 ##,因为您没有要粘贴的两个标记。

任一:

#define ITERATE_ALL10(IDX) IDX = 0; IDX < 10; IDX++

for (ITERATE_ALL10(i)) {

或:

#define ITERATE_ALL10(IDX) (IDX = 0; IDX < 10; IDX++)

for ITERATE_ALL10(i) {

我不是特别推荐任何一种解决方案,但它们应该有效。您的代码(已修改以解决 ## 的问题)生成:

for ((i = 0; i < 10; i++)) {

双括号破坏了语法。