2015-07-19 63 views
1

我有一个阵列的10个元素。将在该元素上调用任意函数C宏在一个范围内运行循环

每个任意的功能可以

  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 

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

+2

为什么使用令牌粘贴操作符?这不是必需的。 – fuz

+2

从宏定义中删除括号或从宏调用周围删除括号。 –

+0

你想要'#define ITERATE_ALL10(IDX)IDX = 0; IDX <10; IDX ++'? – BLUEPIXY

回答

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) 

我更喜欢前者。

+0

我更喜欢'for(i = 0; i <10; i ++){...}'。完全看不到这个宏定义的要点。 –

+0

@squeamishossifrage这个评论应该是“问题”而不是“答案”。 –

+0

@squeamishossifrage我认为他有很多这些功能,并试图以某种方式使事情变得更容易,但是失败了。 –

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

和双括号破坏的语法。