문제

변수 유형을 C에서 런타임으로 결정해야하지만 변수 이름이 고정되어 주어진 경우 변수와 관련된 코드를 재사용하는 방법이 있습니까?

실제로 나는 C 상대방 상황에 대해 묻고 있습니다. 런타임 C ++의 유형을 결정합니다.

가능하면 몇 가지 예를 들어주십시오.

도움이 되었습니까?

해결책

C 언어에는 C ++의 런타임 유형에 대해 묻는 것이 의미있는 객체 지향 기능이 없습니다.

당신은 일반적으로 주조하여 C에서 일반성을 구현합니다. void*. 예시: C 함수 QSORT.

귀하의 질문이 런타임에 결정에 관한 것이라면 실제 유형 A void* 포인터는 불가능합니다. 정보는 대부분의 컴파일러가 전혀 저장하지 않습니다.

다른 팁

하나의 표준 기술은 빠른 유형 정보 변수를 매개 변수로 제공하고이를 켜고 모든 데이터를 참조별로 전달하는 것입니다. 함수 내부에서는 명시 적 주조로 값을 복구합니다. Void* 유형은 컴파일러에 의해 확인되지 않으므로 위험이 함수에 의해 처리되지 않은 유형 (세분화 오류, 데이터 손상 또는 알려지지 않은 동작 결과)을 보냅니다. 필요한 유형의 열거를 설정하여 시작하십시오.

이 경우 컨벤션 type_function을 사용하여 유형을 반환하는 함수를 나타냅니다.

열거 지시문은 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 ... */

일회성 기능을 사용하는 것 외에 Varargs 기능을 사용하는 것이 좋습니다.http://www.eskimo.com/~cs/cclass/int/sx11b.html

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top