문제
변수 유형을 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