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