2011-07-12 186 views
18

是否有可能通過變量類型作爲函數參數的一部分,例如:傳遞變量類型,函數參數

void foo(varType type) 
{ 
    // Cast to global static 
    unsigned char bar; 
    bar = ((type *)(&static_array))->member; 
} 

我記得它是與海灣合作委員會的typeof和使用宏?

+5

不能在標準C.也許在GCC,如果你是(聯合國)幸運。 –

回答

12

你不能這樣做,對於一個功能,因爲那時它需要知道的類型參數(以及函數使用的任何其他符號)來生成工作機器代碼。你可以嘗試像宏:

#define foo(type_t) ({ \ 
    unsigned char bar; \ 
    bar = ((type_t*)(&static_array))->member; \ 
    ... \ 
    }) 
2

因爲C是statically typed language,所以在一般情況下,我看不出如何做到這一點。

編譯器需要在編譯時知道type *的類型是爲了能夠生成對->member的引用。

+0

不要這麼消極有更多的可以做的態度;) –

25

你可以把所有不同類型的可能枚舉,並使用一個開關,使提領:

typedef enum { 
    CHAR, 
    INT, 
    FLOAT, 
    DOUBLE 
} TYPE; 

void foo(TYPE t, void* x){ 
    switch(t){ 
     case CHAR: 
      (char*)x; 
      break; 
     case INT: 
      (int*)x; 
      break; 
     ... 
    } 
} 
+0

嗨hugomg,我很抱歉,但我不明白的替代方案。你能否詳細說明一下?謝謝:-) – leaf

+0

我剛剛意識到替代方案並不像寫作那樣工作......所以我刪除了它。但我原來的基本想法是用「面向對象」的風格對事物進行編碼,並使用子類型多態來做分支而不是switch語句。 – hugomg

+0

好的。謝謝:-) – leaf

3

不是一個函數,但是你可以使用宏象這樣:

#include <stdio.h> 
#define swap(type, foo, bar) ({type tmp; tmp=foo; foo=bar; bar=tmp;}) 

int main() { 
    int a=3, b=0; 
    printf("a=%d, b=%d \n", a, b); // a=3, b=0 
    swap(int, a, b); // <-- action happens here 
    printf("a=%d, b=%d \n", a, b); // a=0, b=3 

    return 0; 
}