質問

変数の型はCでランタイムのように決定されなければならないが、変数名が固定され、指定された場合、変数を含むコードを再利用する方法はありますか?

実は私はランタイムのCの対応状況について尋ねていますC ++ のタイプを決定ます。

可能であれば、いくつかの例をお願いします。

役に立ちましたか?

解決

C言語はC ++でオブジェクトの実行時の型について質問することが有意義なものオブジェクト指向機能を持っていません。

あなたは、通常void*にしてからキャストしてCでの汎用性を実現します。例: rel="noreferrer">

あなたの質問は、実際どのようなタイプvoid*ポインタポイントに実行時に決定する程度であれば、それは不可能です。情報は単にほとんどのコンパイラですべてで保存されていません。

他のヒント

1つの標準的な技術は、パラメータとして迅速な型情報変数を提供することです その上に切り替え、参照することによって、すべてのデータを渡します。関数の内部で、我々は明示的なキャストと値を回復します。危険が機能(セグメンテーションフォールト、データの破損または未知の行動の結果)によって、未処理であるタイプを送信しているので、ボイド*型はコンパイラによってオフになっています。 あなたが必要とするタイプの列挙を設定することから始めます:

ここでI型を返す関数を表すために従来の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 ... */

1オフ機能以外の 可変引数関数を使用することをお勧めします http://www.eskimo.com/~scs/cclass/int/sx11b .htmlをする

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top