Значение «this» зависит от «контекста», в котором выполняется функция. Контекстом может быть любой объект или глобальный объект, т. Е. Окно.
Таким образом, семантика «этого» отличается от традиционных языков ООП. И это вызывает проблемы: 1. когда функция передается другой переменной (скорее всего, обратный вызов); и 2. когда замыкание вызывается из метода-члена класса.
В обоих случаях это устанавливается в окно.
Действительно ли возможно разыменовать пустой указатель, не преобразовывая тип на языке программирования C...
Нет, void
указывает на отсутствие типа, это не что-то, что можно разыменовать или присвоиться к.
есть ли существует любой способ обобщить функцию, которая может получить указатель и сохранить его в пустом указателе, и при помощи того пустого указателя мы можем сделать обобщенную функцию..
Вы не можете только разыменовать его портативным способом, поскольку это не может быть правильно выровненное. Это может быть проблема о некоторой архитектуре как ARM, где указатель на тип данных должен быть выровненный на границе размера типа данных (например, указатель на 32-разрядное целое число должен быть выровненный на 4-байтовой границе, которая будет разыменована).
Например, чтение uint16_t
от void*
:
/* may receive wrong value if ptr is not 2-byte aligned */
uint16_t value = *(uint16_t*)ptr;
/* portable way of reading a little-endian value */
uint16_t value = *(uint8_t*)ptr
| ((*((uint8_t*)ptr+1))<<8);
Кроме того, адресная арифметика с указателями с пустыми возможными указателями...
Адресная арифметика с указателями не возможна на указателях void
из-за отсутствия конкретного значения под указателем и следовательно размером.
void* p = ...
void *p2 = p + 1; /* what exactly is the size of void?? */
void abc(void *a, int b) {
char *format[] = {"%d", "%c", "%f"};
printf(format[b-1], a);
}
Нет, это не возможно. Какой тип разыменованное значение должно иметь?
В C, a void *
может быть преобразован в указатель на объект другого типа без явного броска:
void abc(void *a, int b)
{
int *test = a;
/* ... */
Это не помогает с записью Вашей функции более универсальным способом, все же.
Вы не можете разыменовать a void *
с преобразованием его к другому типу указателя, поскольку разыменование указателя получает значение указанного объект. Явное void
не допустимый тип так derefencing a void *
не возможно.
Адресная арифметика с указателями об изменяющихся значениях указателя кратными числами sizeof
указанный объекты. Снова, потому что void
не истинный тип, sizeof(void)
не имеет никакого значения, таким образом, адресная арифметика с указателями не допустима на void *
. (Некоторые реализации позволяют его, с помощью эквивалентной адресной арифметики с указателями для char *
.)
Я хочу сделать этот функциональный дженерик, не используя IFS; действительно ли это возможно?
Единственным простым путем я вижу, должен использовать перегрузку.. который не доступен в C, программирующем langage AFAIK.
Вы рассматривали программирование на C++ langage для Вашей программы? Или есть ли какое-либо ограничение, которое запрещает его использование?
Вы должны знать, что в C, в отличие от Java или C #, нет абсолютно никакой возможности успешно «угадать» тип объекта, на который указывает указатель void *. Нечто похожее на "getClass ()" просто не существует, так как нигде нет этой информации. По этой причине тип «универсального», который вы ищете, всегда сопровождается явной метаинформацией, такой как «int b» в вашем примере или строка формата в семействе функций printf.