Это происходит до того времени, когда квалификатор const
был введен в C. Тело стандартов C очень консервативно по отношению к существующему коду.Любое улучшение языка должно быть сделано таким образом, чтобы оно не нарушало существующий соответствующий код, написанный для предыдущей версии стандарта.
Если такие вещи приводят к нежелательным осложнениям,затем эта функция устарела и возможно изменилась спустя годы после этого.
Для конкретной функции строковых литералов, набираемых char[]
вместо char const[]
, да, к сожалению, это ловушка для начинающих,Просто возьмите с самого начала привычку использовать char const*
всякий раз, когда вы ссылаетесь на такие строки.
Редактировать: На вопрос, может ли компилятор предупредить об этом, я думаю, это простотрудно отследить.В этом коде
int main(void) {
"hello"[0] = 'H';
char * a = "hoho";
a[0] = 'H';
}
gcc дает мне только предупреждение о первом назначении, но не о втором.лязг не захватывает это вообще.