2011-07-12 184 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; 
}