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