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