среда выполнения определяет тип для C
-
20-09-2019 - |
Вопрос
Если тип переменной должен быть определен как runtime в C, но имя переменной фиксировано и задано, есть ли какой-либо способ повторно использовать код, который включает переменную?
На самом деле я спрашиваю о ситуации с C-аналогом среда выполнения определяет тип для C ++.
Если возможно, пожалуйста, приведите несколько примеров.
Решение
Язык C не обладает объектно-ориентированными функциями, которые делают целесообразным задавать вопрос о типе объекта во время выполнения в C++.
Обычно вы реализуете универсальность в C путем приведения к и от void*
.Пример: функция C qsort.
Если ваш вопрос заключается в определении во время выполнения того, какой фактический тип void*
указатель указывает на то, что это невозможно.Информация просто не сохраняется большинством компиляторов.
Другие советы
Одним из стандартных методов является предоставление переменной быстрого типа info в качестве параметра , включение ее и передача всех данных по ссылке.внутри функции мы восстанавливаем значение с помощью явного приведения.Тип void * не отмечен компилятором, поэтому опасность заключается в отправке типа, который не обрабатывается функцией (ошибка сегментации, повреждение данных или результат неизвестного поведения).начните с настройки перечисления нужных вам типов:
В этом случае я использую условный ТИП_ФУНКЦИИ для представления функции, возвращающей тип.
Директива 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 ... */
За исключением одноразовой функции рекомендуется использовать функции varargs http://www.eskimo.com /~scs/cclass/int/sx11b.html