Во время недавнего обсуждения (см. комментарии к этот ответ ), R .. рекомендовал никогда не создавать псевдонимы для указателя на- типов const
, поскольку вы не сможете легко освободить объекты, на которые ссылаются, в соответствующей программе на C (помните: free ()
принимает аргумент указателя, не являющийся const
и C99 6.3.2.3 допускают преобразование только из неквалифицированного в квалифицированный ).
Язык C, очевидно, предполагает наличие владельца для любого выделенного объекта, то есть кто-то где-то должен хранить не const
указатель на объект, и этот кто-то отвечает за освобождение.
Теперь рассмотрим библиотеку, выделяющую и инициализирующую объекты, которые не могут быть изменены из кода пользовательского пространства, поэтому вызовы функций всегда возвращают указатели, соответствующие const
.
Очевидно, библиотека является владельцем объекта и должен сохранять указатель, отличный от const
, что несколько глупо, поскольку пользователь уже предоставляет вполне допустимую, но const
копию указателя при каждом вызове библиотеки.
Освободить такой указатель. объект, библиотека должна удалить квалификатор const
; насколько я могу судить, следующее
void dealloc_foo(const struct foo *foo)
{
free((void *)foo);
}
верно для C; он был бы недействителен только в том случае, если бы параметр foo
был дополнительно квалифицирован restrict
-квалифицирован.
Однако удаление const
кажется несколько взломанным.
Есть ли другой способ, кроме удаления const
из всех возвращаемых значений библиотечных функций, что приведет к потере любой информации об изменчивости объекта?