2011-07-12 26 views
18

それは関数パラメータの一部として変数の型を渡すことができ、例えば:関数のパラメータとして変数の型を渡す

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

私はそれがGCCのtypeofとマクロを使用してとは何かを持って覚えていますか?

+5

ありません。 –

答えて

12

それはの種類を知る必要がありますので、あなたは、機能のためにそれを行うことはできません引数(および関数が使用するその他のシンボル)を使用して、動作マシンコードを生成します。あなたは次のようにマクロを試みることができる:

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

Cがstatically typed languageの場合、一般的なケースでこれをどうやって行うことができないのでしょうか。

コンパイラは、->memberへの参照を生成するために、type *の型がコンパイル時にわかっている必要があります。

+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

ない機能がありますが、そのようなマクロを使用することができます:あなたは(国連)幸運であれば、たぶん、GCCに標準C.で

#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; 
} 
関連する問題