如果變量的類型必須在C中確定爲運行時,但變量名是固定的並且給定,那麼是否有任何方法可以重用涉及變量的代碼?運行時間確定C的類型
其實我在問關於runtime determine type for C++的C對口情況。
如果可能的話請舉一些例子。
如果變量的類型必須在C中確定爲運行時,但變量名是固定的並且給定,那麼是否有任何方法可以重用涉及變量的代碼?運行時間確定C的類型
其實我在問關於runtime determine type for C++的C對口情況。
如果可能的話請舉一些例子。
C語言沒有面向對象的特性,這使得在C++中詢問對象的運行時類型有意義。
您通常在C中執行通用性,通過鑄造void*
。例如:the C function qsort。
如果你的問題是關於在運行時確定一個指針指向的實際類型,那是不可能的。大多數編譯器根本不存儲這些信息。
一種標準技術是提供一個快速類型信息變量作爲參數 並打開它,並通過引用傳遞所有數據。在函數內部,我們通過顯式強制轉換來恢復值。 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