如何知道C中未知类型变量的数据类型? #包括 虚空乐趣(虚空*x) { //“x”的数据类型是什么,因为我可以传递float而不是 //所以首先我必须检查这个数据类型,然后继续。 } int main() { int n=10; 乐趣&&n; }

如何知道C中未知类型变量的数据类型? #包括 虚空乐趣(虚空*x) { //“x”的数据类型是什么,因为我可以传递float而不是 //所以首先我必须检查这个数据类型,然后继续。 } int main() { int n=10; 乐趣&&n; },c,gcc,c99,C,Gcc,C99,您可以看到,我们不知道函数fun()中“x”的类型,因此,如果不在函数参数中使用(传递)任何其他信息,我们如何才能发现呢?C没有运行时类型信息。当你传递一个指针时,你就会传递一个裸指针——一个内存地址 如果使用指向void的指针,但需要知道类型,则必须传递一些附加信息。否则,您将为不同的类型创建不同的函数,例如需要int的foo、需要double的dfoo等等。当您强制转换为空*,您无法知道类型。使用void指针时必须小心,因为可以将其强制转换为任何类型。这就是使用void指针的目的。C不允许获

您可以看到,我们不知道函数fun()中“x”的类型,因此,如果不在函数参数中使用(传递)任何其他信息,我们如何才能发现呢?

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


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

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

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

可能是这样的:

#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);
}
C11必须帮助您解决此问题。您可以执行类似以下示例的操作:

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;
}
然后用你自己的方式来称呼它:

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

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


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

C实现这一点的方法是使用标记的联合:

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

恐怕你不能。不是在纯C中。您需要传递额外的信息。C只知道arguments类型中包含的信息,所以在本例中,它是一个“指向某物的指针”。C++中有一些机制可以帮助,但是当传递一个简单的int时,它们不会工作,而不是关于空洞指针,PrtTf是一个类似的情况。您以格式字符串的形式向函数发送类型信息,以便它可以知道它接收的数据的类型。在运行时,除了像这样的手动检测之外,无法获取此信息。所以这不是额外的。
float n = 10.0f;
myFunction(&n);
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);
}