В отличие от C++, в C нет понятия const_cast
. То есть, не существует корректного способа преобразовать указатель с оговоркой const в указатель без оговорки:
void const * p;
void * q = p; // not good
Во-первых: Является ли это приведение на самом деле неопределенным поведением?
В любом случае, GCC предупреждает об этом. Чтобы сделать "чистый" код, требующий const-каст (т.е. когда я могу гарантировать, что не буду изменять содержимое, но все, что у меня есть - это изменяемый указатель), я видел следующий трюк "преобразования":
typedef union constcaster_
{
void * mp;
void const * cp;
} constcaster;
Использование: u.cp = p; q = u.mp;
.
Каковы правила языка Си по отбрасыванию константности через такое объединение? Мои знания языка Си очень скудные, но я слышал, что Си гораздо мягче относится к доступу к союзам, чем C++, поэтому, хотя у меня плохое предчувствие по поводу этой конструкции, я хотел бы получить аргумент из стандарта (C99, я полагаю, хотя, если это изменилось в C11, было бы неплохо узнать).