3
#include<stdio.h>
void fun(void *x)
{
    //what is the data type of 'x', since I could have passed float instead of 
    //  int so first I have to check datatype of this and then proceed further.
}
int main()
{
     int n=10;
     fun(&n);
}

您可以看到我们不知道函数 fun() 中“x”的类型,那么我们如何在不使用(传递)函数参数中的任何其他信息的情况下找出它?

4

5 回答 5

4

C11 具有类型泛型表达式来帮助您解决这个问题。您可以执行以下示例:

#define myFunction(X) _Generic((X), \
    int *:   myFunctionInt,         \
    float *: myFunctionFloat,       \
    default: myFunctionInt          \
    )(X)

void myFunctionInt(int *x);
void myFunctionFloat(float *x);

然后按你的方式称呼它:

int n = 10;
myFunction(&n);

或者:

float n = 10.0f;
myFunction(&n);

您将需要实现单独的目标函数,但您可以在那里执行指针魔术并传递给一个公共处理程序,例如。

于 2013-10-29T14:57:54.613 回答
2

C 没有运行时类型信息。当你传递一个指针时,你传递一个裸指针——一个内存地址。

如果您使用指针void但需要知道类型,那么您必须传递一些附加信息。否则,您将为不同的类型创建不同的函数,例如foo需要a intdfoo需要 adouble等等。

于 2013-10-29T14:16:30.943 回答
2

当您转换为 void * 时,您无法知道类型。使用 void 指针时必须小心,因为您可以将其转换为任何类型。这就是拥有 void 指针的目的。

于 2013-10-29T14:16:31.150 回答
2

C不允许获取传递的变量的类型void*。唯一能做到的就是自己编写一种面向对象的代码。

大概是这样的:

typedef struct generic_type_s 
{
    void* data;
    void  (*f)(void* data);
} generic_type_t;

void f_int(void* _data)
{
    int* data = (int*)_data;
    // Do something
}

int main()
{
   int data1 = 10;
   // Generic variable initialization
   generic_type_t gv;
   gv.data = &data1;
   gv.f = f_int;

   // Calling an appropriate function
   gv.f(gv.data);

   return 0;
}
于 2013-10-29T14:16:53.287 回答
0

这样做的 C 方法是使用标记的联合:

typedef enum {
    // will default to TypeUnitialized if unspecified in structure initializer
    TypeUninitialized = 0,
    TypeFloat = 1,
    TypeInt
} type_t;

typedef struct {
    type_t type;
    union {
        int u_int;
        float u_float;
    };
} gen_val_t;

void fun(gen_val_t v)
{
    switch (v.type) {
    case TypeFloat:
        // process float
        break;
    case TypeInt:
        // process int
        break;
    default:
        // error
        break;
    }
}

int main(int argc, char **argv)
{
    gen_val_t ov = { .type = TypeFloat,
                     .u_float = 3.45 };
    fun(ov);
}
于 2013-10-29T15:02:50.317 回答