C宏在一个范围内运行循环

use*_*449 1 c macros c-preprocessor

我有一个包含 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]);
    }
}
Run Code Online (Sandbox Code Playgroud)

我无法弄清楚如何修复错误:

expected ';' before ')' token
Run Code Online (Sandbox Code Playgroud)

expected expression before ')' token
Run Code Online (Sandbox Code Playgroud)

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

fuz*_*fuz 5

您的代码中有两个错误.

首先,您##错误地使用了令牌粘贴操作符.此运算符用于粘贴两个标记以生成新标记,例如foo ## baryield foobar.您在代码中不需要它,只需删除它即可.

解决此问题后,您的宏看起来像这样:

#define ITERATE_ALL10(IDX) (IDX = 0; IDX < 10; IDX++)
Run Code Online (Sandbox Code Playgroud)

这就是扩展的样子:

for ((i = 0; i < 10; i++)) {
Run Code Online (Sandbox Code Playgroud)

请注意,有一对冗余的括号,这是抛出编译器的原因.从宏定义中删除括号:

#define ITERATE_ALL10(IDX) IDX = 0; IDX < 10; IDX++
Run Code Online (Sandbox Code Playgroud)

或者从宏调用中删除括号:

for ITERATE_ALL10(i)
Run Code Online (Sandbox Code Playgroud)

我更喜欢前者.