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

时间:2015-07-19 21:45:47

标签: c macros c-preprocessor

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

每个任意函数都可以

  1. 在单个元素上操作,或
  2. 相同的功能将对所有元素起作用。
  3. 我有各种遵循这种模式的功能。

    我试图这样做:

    #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
    

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

2 个答案:

答案 0 :(得分:5)

您的代码中有两个错误。

首先,您错误地使用了令牌粘贴操作符##。该运算符用于粘贴两个令牌以创建新令牌,例如, 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)

我更喜欢前者。

答案 1 :(得分:0)

从宏定义中删除括号或从宏调用周围删除括号。您还需要删除令牌粘贴操作符##,因为您没有要粘贴的两个令牌。

或者:

#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++)) {

并且双括号破坏了语法。