2010-01-15 101 views

回答

7

C語言沒有面向對象的特性,這使得在C++中詢問對象的運行時類型有意義。

您通常在C中執行通用性,通過鑄造void*。例如:the C function qsort

如果你的問題是關於在運行時確定一個指針指向的實際類型,那是不可能的。大多數編譯器根本不存儲這些信息。

1

一種標準技術是提供一個快速類型信息變量作爲參數 並打開它,並通過引用傳遞所有數據。在函數內部,我們通過顯式強制轉換來恢復值。 void *類型未被編譯器選中,所以危險在於發送一個未被該函數處理的類型(分段錯誤,數據損壞或未知行爲結果)。 首先設置所需類型的枚舉:

在這種情況下,我使用約定TYPE_FUNCTION來表示返回類型的函數。

enum指令從0, 中選擇連續整數,或者您可以爲每個枚舉分配自己的int值。

typedef enum D_types { 
ANINT, // don't use actual system type names 
AFLOAT, 
ADOUBLE, 
ASTRING, 
MY_STRUCT=100, 
MY_STRUCT2=200 
VOID_FUNCTION=1000, 
INT_FUNCTION = 2000, 
STRUCT_FUNCTION=3000 
} DATATYPE; 

/* an f_int is a function pointer to a function */ 
typedef int (*f_int)(int, void*); 

在函數定義您參考和類型 同時發送數據,並在使用前將它轉換爲正確的類型:

int myfunction (DATATYPE dt, void* data, ) 
{ 
    int an_int = 0; 
    int * ip; // typed pointers for casting of the void pointer data 
    double * dp; 
    char * sp; 
    struct My_struct * msp; 
    struct My_struct_2 * ms2p; 
    f_int fp; 
    ... 

    switch (dt){ 
    case ANINT: 
     ip = (int*) data; // only pointers can be assigned void pointer values. 
     int i = *ip  // dereference of typed pointer, no dereferencing void pointers. 
     ... 
     break; 
    case ADOUBLE: 
     dp = (double*) data; 
     double d = *dp; 
     ... 
     break; 
    case ASTRING: 
     char * s = strdup((char*) data); // cast to char pointer allowed (pointer->pointer) 
     ... 
     break; 
    case MY_STRUCT: 
     msp = (struct My_Struct *) data; 
     char* ms_name = msp->name; // if my_struct has a name string ... 
     float dollarvalue = msp->dvalue; 
     ... 
    case INT_FUNCTION: 
     fp = (f_int)data; 
     an_int = fp(ANINT, 5); 
    } 
return an_int; 
} 

正如你可能已經猜到,這是玩火柴一個煙花爆竹廠, ,並不鼓勵作爲一個不斷的練習。

在你的代碼

你會這樣稱呼它:

double pi =3.14159; 
int g = myfunction(ADOUBLE, &pi ); // pass by reference, not value 

int j = myfunction (ASTRING , "HEY NOW"); //C strings pass by ref normally 



f_int myfunc = myfunction; // a function pointer (ref to the functions address) 

int r = myfunction (INT_FUNCTION, myfunc); /* function as a parameter ... */ 

比一次性的功能 其他則建議使用可變參數功能 http://www.eskimo.com/~scs/cclass/int/sx11b.html