函数与void参数

时间:2014-05-12 18:20:20

标签: c void

我必须执行一个函数,它接受任何数据类型的变量并返回相同数据类型的变量。我不知道如何做到这一点我所知道的是我必须使用void作为我的参数的数据类型所以我所拥有的就是这个并且显然不起作用:

void better (void a, void b)
{
    if ( a > b )
        return a;
    else if ( b > a )
        return b;
}

所以我的问题是这样做的正确方法是什么? 这不是我的确切任务,我只是想了解它是如何工作的。

3 个答案:

答案 0 :(得分:1)

或许首先确定比较方法会有所帮助:

typedef enum CMPTYPE_E
   {
   CMPTYPE_STRCMP,
   CMPTYPE_INT
// ..etc
   } CMPTYPE_T;

然后,可以提供一种方法来比较每个定义的类型:

void *better (void *a, void *b, CMPTYPE_T cmpType)
   {
   switch(cmpType)
      {
      case CMPTYPE_STRCMP:
         return(strcmp(a,b) > 1 ? a : b);

      case CMPTYPE_INT:
         return((*((int *)a) > *((int *)b)) ? a : b);         

 //   ...etc
      }
   }        

答案 1 :(得分:1)

你要做的是创建一种通用函数,它接受某种类型的参数并返回相同类型的较大值。

问题是,你实际上不能在C中做到这一点。虽然确实可以使用相同类型的>逻辑比较几个C基元类型 ,但不是所有的可以像这样有意义地进行比较,即使它们可以,编译器也不会让你这样做 - 没有办法说“带有未知类型的参数”和“返回参数的任何类型”。

C要求您明确定义类型,这通常意味着为您要支持的每种类型创建此函数的不同版本。换句话说,创建一个better_int函数和一个better_float函数等,然后调用相应的函数。


在这种情况下,还可以使用其他编译器功能(称为宏)在编译代码之前为您自动生成此比较代码。这可以实现您的目标,但不能使用纯C结构。如果您仍希望以这种方式解决此问题,请随意询问有关此方法的更多信息。

答案 2 :(得分:0)

如果您仅限于C,则可以使用void*作为参数类型和返回类型。这样可行,但如果传入错误的类型,则无法保护编译器。您必须注意管理变量,并确保如果传入char*,例如,该函数将处理它而不是其他东西。

另请注意,您现在处理指针和地址而不是基本类型。这为您的逻辑带来了新的复杂程度,特别是如果您为必须稍后释放的返回值分配内存(例如malloc)。