这是非常不好的做法,不要这样做。其他 C 程序员完全了解 for 循环,但他们完全不知道您的私有、秘密宏语言。此外,像这样的类函数宏的类型安全性很差,只能作为最后的手段使用。
正确的解决方案是不使用宏,而是使用函数。如果您希望使用正确的泛型编程,可以按如下方式编写:
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]);
}
}
Where 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);
}
EDIT:
在上面的例子中,数据类型是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);
}