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それ以外の場合は、を期待するintdfooを期待するなど、さまざまな型に対してさまざまな関数を作成doubleします。

于 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 に答える