У меня есть функция с таким прототипом:
ErrorType function(void ** parameter, other_args);
Эта функция считывает указатель, на который указывает «параметр», и изменяет его (подумайте об этом как о realloc).
Теперь, чтобы быть правым в соответствии со стандартом C, если я хочу передать адрес другого указателя, кроме void *, я должен объявить временную переменную void * и использовать ее вместо этого.
Итак, я хочу создать оболочку (мне все равно, функция это или макрос), которая выполняет вызов функции с любым типом указателя.
Я думаю, что мог бы сделать это в C11 с помощью _Generic и функции для каждого базового типа, а также функции для всех структур и функции для всех объединений, но я думаю, что это слишком хлопотно.
Я также читал о расширении GCC, которое позволяет вам писать операторы и объявления в выражениях, и я думаю, что могу легко делать с этим то, что хочу, но я предпочитаю, чтобы мой код компилировался во всех стандартных компиляторах, а не только в GCC или Clang. .
Итак, вопрос в том, есть ли способ сделать это без особых проблем в компиляторе C11?
double **
кvoid **
допустимо, переход кfunction
тоже допустим, но разыменование является нарушением строгого алиасинга (доступ к объектуdouble *
с lvalue типаvoid *
). Кроме того, могут быть проблемы с разными представлениями дляvoid *
иdouble *
(но я считаю, что это не проблема на распространенных платформах). - person mafso   schedule 19.08.2014memcpy
ed помнят свой исходный тип (эффективный тип в стандарте), поэтому строгое присвоение псевдонимов по-прежнему является проблемой. Я не думаю, что это обсуждение приведет к ответу на вопрос здесь, поэтому, если вам интересно, давайте продолжим в чате. - person mafso   schedule 19.08.2014