それは関数パラメータの一部として変数の型を渡すことができ、例えば:関数のパラメータとして変数の型を渡す
void foo(varType type)
{
// Cast to global static
unsigned char bar;
bar = ((type *)(&static_array))->member;
}
私はそれがGCCのtypeof
とマクロを使用してとは何かを持って覚えていますか?
それは関数パラメータの一部として変数の型を渡すことができ、例えば:関数のパラメータとして変数の型を渡す
void foo(varType type)
{
// Cast to global static
unsigned char bar;
bar = ((type *)(&static_array))->member;
}
私はそれがGCCのtypeof
とマクロを使用してとは何かを持って覚えていますか?
それはの種類を知る必要がありますので、あなたは、機能のためにそれを行うことはできません引数(および関数が使用するその他のシンボル)を使用して、動作マシンコードを生成します。あなたは次のようにマクロを試みることができる:
#define foo(type_t) ({ \
unsigned char bar; \
bar = ((type_t*)(&static_array))->member; \
... \
})
Cがstatically typed languageの場合、一般的なケースでこれをどうやって行うことができないのでしょうか。
コンパイラは、->member
への参照を生成するために、type *
の型がコンパイル時にわかっている必要があります。
もっと否定的な態度をすることはできません;) –
あなたは、可能なすべての種類ごとに列挙を行い、逆参照を行うためにスイッチを使用することができます。
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;
...
}
}
ない機能がありますが、そのようなマクロを使用することができます:あなたは(国連)幸運であれば、たぶん、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;
}
ありません。 –