我有一个包含10个元素的数组。在该元素上调用任意函数。
每个任意函数都可以
我有各种遵循这种模式的功能。
我试图这样做:
#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
我做错了什么?有没有更好的方法来实现我想要的目标?
答案 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++)) {
并且双括号破坏了语法。