3

我刚从 C# 来到 C,并正在寻找一种方法来定义像 C# 中的泛型函数。我遇到了这篇文章,但是当我试图编译它时,我得到了一堆错误(“`n' undeclared here (not in a function)”、“在“array”之前的语法错误”等)这是我的代码:

#include<conio.h>
#include<stdlib.h>

#define MAKE_PRINTEACH(TYPE)\
void printeach_##TYPE (TYPE[n] array, int n, void(*f)(TYPE)){\
  int i;\
  for(i = 0; i < n; i++) {\
    f(array[i]);\
  }\
}

MAKE_PRINTEACH(int)
MAKE_PRINTEACH(float)

void printInt(int x)
{
     printf("got %d\n",x);
}

void printFloat(float x)
{
     printf("got %f\n",x);
}

int main()
{
    int[5] ia = {34,61,3,6,76};
    float[6] fa = {2.4,0.5,55.2,22.0,6.76,3.14159265};

    printeach_int(ia, 5, printInt);
    printeach_float(fa,6,printFloat);

    getch();
}

我在这里做错了什么?如果这有所作为,我正在使用 DevC++。

4

2 回答 2

2

正确的版本看起来像这样

#define MAKE_PRINTEACH(TYPE)                                     \
void printeach_##TYPE (size_t n, TYPE array[n], void(*f)(TYPE)){ \
  for(size_t i = 0; i < n; i++) {                                \
    f(array[i]);                                                 \
  }                                                              \
}

总结一下您的版本出了什么问题:

  • n必须在使用前声明
  • 数组边界在标识符之后
  • 数组大小的语义正确类型和类似的东西是size_t
  • C 因为 C99 也有for循环的局部变量。
于 2012-10-12T21:38:50.260 回答
0

您可以尝试这种变化:

#define MAKE_PRINTEACH(TYPE)\
void printeach_##TYPE (TYPE * array, int n, void(*f)(TYPE)){\
  int i;\
  for(i = 0; i < n; i++) {\
    f(array[i]);\
  }\
}

TYPE[n] array意味着编译器支持 VLA(可变长度数组),我不知道您的编译器是否支持。

gcc添加命令行选项-std=c99将使原始代码编译。

更新: 按照 Jens 的评论进行了更正。

我建议的解决方案是简单地将指针传递给数组(如 OP 中所建议的)将包含的类型的变量。这样做就是将数组传递给函数的方式。它们通过引用传递。

Jens 还提到了其他几个警告/错误。有:

1conio.h不是标准的 C 包含,stdio.h在这里应该是合适的

2 数组是通过将数组的大小添加到变量名而不是类型来声明的。必须是:int ia[5]不是int[5] ia

3 return ,OP 不返回任何东西main()int

getch()4缺少原型。可能想包括curses.h

于 2012-10-12T16:41:49.570 回答