gpt4 book ai didi

c - 替换嵌套 for 循环的宏

转载 作者:行者123 更新时间:2023-12-02 08:03:40 29 4
gpt4 key购买 nike

我找到了这个宏 #define TIMES(x) for(int i1=0;i1<x;i1++)缩短代码文本非常实用。但是当我有嵌套循环时,我不知道如何编写这样的宏,甚至不知道是否可能。这个想法如下。是否可以编写这段代码

for(int i1=0;i1<5;i1++)
for(int i2=0;i2<3;i2++)
for (int i3=0;i3<7;i3++)
/* many nested `for` loops */
{
/* some code, for example to print an array printf("%d \n",a[i1][i2][i3]) */
}

作为

TIMES(5) TIMES(3) TIMES(7) ....
{
/* some code, for example to print an array printf("%d \n",a[i1][i2][i3]) */
}

使用一种“递归”宏来检测所有 TIMES并用 for 替换它们使用 i1、i2、i3 循环……我的循环计数器?

最佳答案

这是非常糟糕的做法,不要这样做。其他 C 程序员非常了解 for 循环,但他们完全没有注意到您私有(private)的、 secret 的宏语言。此外,像这样的类函数宏的类型安全性很差,只能作为最后的手段使用。

正确的解决方案不是使用宏,而是使用函数。如果你想使用适当的泛型编程,你可以这样写:

typedef void callback_t (int data);

void traverse (size_t n, int data[n], callback_t* callback)
{
for(size_t i=0; i<n; i++)
{
callback(data[i]);
}
}

其中callback 是调用者提供的函数指针,它包含了实际的功能。类似于宏中的循环体。

完整示例:

#include <stdio.h>

typedef void callback_t (int data);

void traverse (size_t n, int data[n], callback_t* callback)
{
for(size_t i=0; i<n; i++)
{
callback(data[i]);
}
}


void print (int i)
{
printf("%d ", i);
}

int main (void)
{
int array [5] = {1, 2, 3, 4, 5};

traverse(5, array, print);
}

编辑:

在上面的例子中,数据类型是int。但由于它是泛型编程,您可以进行一些调整并将其替换为任何其他数据类型,例如数组或结构。然后要注意的是,您必须通过指针将参数传递给回调,而不是按值传递。示例:

#include <stdio.h>

/* Generally it is bad practice to hide arrays behind typedefs like this.
Here it just done for illustration of generic programming in C. */
typedef int data_t[3];

typedef void callback_t (data_t* data);

void traverse (size_t n, data_t data[n], callback_t* callback)
{
for(size_t i=0; i<n; i++)
{
callback(&data[i]);
}
}


void print_array (int(*array)[3])
{
int* ptr = *array;
printf("{%d %d %d}\n", ptr[0], ptr[1], ptr[2]);
}

int main (void)
{
int array [2][3] = { {1, 2, 3}, {4, 5, 6} };

traverse(2, array, print_array);
}

关于c - 替换嵌套 for 循环的宏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54142141/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com