Не должен ли прототип быть const char * strchr (const char * str, int c);
Нет из-за обратной совместимости и более широкого применения.
В первые годы существования C const
не существовало, а strchr()
было эффективным как
char *strchr(char *str, int c);
С добавлением const
изменение аргумента с char *
на const char *
не нарушило существующий код, но позволило новому коду передать char *
или const char *
в strchr()
. То, что const
в подписи также указывало, что strchr(const char *str, ...)
не изменило данные, на которые указывает str
.
Возвращение const char *
из strchr()
нарушило бы существующий код. Кроме того, когда strchr()
вызывается с char *
, возврат char *
- это нормально. С перегрузкой функций, как в C ++, обе функции существуют.
char *strchr(char *str, int c);
const char *strchr(const char *str, int c);
Та же проблема относится ко многим другим функциям: strto...(), bsearch(), memchr(), strpbrk(), strrchr(), strstr(), ...
Это вопрос для нового кода, должны ли вы разработать функцию, которая возвращает указатель, полученный из предоставленного указателя: возвращать const
или нет или формировать 2 функции?
const_or_not char *foo(const char *s)