тип возвращаемого значения для strchr () non const? - PullRequest
2 голосов
/ 19 марта 2019

В Debian 9 с GCC 8.2, libc6-dev:amd64 2.27:

Страница man для strchr (и многих других <string.h> функций) имеет этот прототип:

   char *strchr(const char *s, int c);

Как он может вернуть не- const char *, если его источником является const char *?

Разве прототип не должен быть const char *strchr(const char *str, int c);?

Ответы [ 2 ]

3 голосов
/ 19 марта 2019

Не должен ли прототип быть 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)
2 голосов
/ 19 марта 2019

В этом случае const просто означает, что strchr не будет изменять строку на вас.Вызывающий должен определить, может ли строка быть изменена или нет.

например,

void myFn(const char* param)
{
    char* p = strchr(param, 'A');
    /* I know there should be a NULL check too ;-) */
    *p = 'Z';
}

будет недопустимым, но если параметр не будет const, все будет в порядке.

...