C 宏 运行 范围内的循环
C macro to run a loop over a range
我有一个包含 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
我做错了什么?有没有更好的方法来实现我想要的?
您的代码中有两个错误。
首先,您错误地使用了令牌粘贴运算符##
。此运算符用于粘贴两个令牌以制作一个新令牌,例如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++)) {
双括号破坏了语法。
我有一个包含 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
我做错了什么?有没有更好的方法来实现我想要的?
您的代码中有两个错误。
首先,您错误地使用了令牌粘贴运算符##
。此运算符用于粘贴两个令牌以制作一个新令牌,例如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++)) {
双括号破坏了语法。