📜  在 C 中为 foreach() 提供的参数无效 (1)

📅  最后修改于: 2023-12-03 15:07:37.416000             🧑  作者: Mango

在C中为foreach()提供的参数无效

在C语言中,没有内置的foreach循环结构,但许多编译器提供了以此模拟foreach的宏定义。这些宏定义通常接受三个参数:序列名、序列中项目的类型和循环体。然而,使用错误的参数类型可能导致foreach宏定义功能失效。

foreach宏定义的基本语法

foreach宏定义的基本语法如下所示:

#define foreach(item, array, len) \
    for(int keep = 1, \
            count = 0, \
            size = sizeof (array) / sizeof *(array); \
        keep && count != size; \
        keep = !keep, count++) \
      for(item = (array) + count; keep; keep = !keep)

其中:

  • item:代表当前处理的元素。
  • array: 被遍历的数组。
  • len: 数组的长度。
参数无效导致foreach()无法正常工作

在使用foreach宏定义时,使用错误的参数类型可能导致foreach宏定义无法正常工作。对于数组类型,foreach宏定义可以正确地计算数组的大小,但是对于指针类型,数组长度无法正常计算。

例如,尝试使用foreach宏定义遍历一个字符串数组:

char* strings[] = {"hello", "world", "!"};
foreach(char* str, strings, sizeof(strings))
{
    printf("%s \n", str);
}

该代码段将打印出数组中的每一个字符串。然而,如果更改代码以使用指针来遍历字符串数组:

char* strings[] = {"hello", "world", "!"};
foreach(char* str, *strings, sizeof(*strings))
{
    printf("%s \n", str);
}

该代码段将无法正常工作,因为第三个参数无法正确计算字符串数组的长度,无法进行遍历。正确的写法应该是:

char* strings[] = {"hello", "world", "!"};
foreach(char* str, strings, sizeof(strings) / sizeof(*strings))
{
    printf("%s \n", str);
}
总结

在使用foreach宏定义时,要确保正确地传递参数类型和值。对于数组类型,数组长度可以正确计算。对于指针类型,则需要手动指定数组长度或使用其他方法来确定数组长度。