Почему strerror не возвращает константный указатель? - PullRequest
1 голос
/ 22 июня 2010

Я просто просматривал стандарт C99, искал что-то, что не помню сейчас, когда заметил, что указатель, возвращенный из функции strerror (раздел 7.12.6.2), не является константным, хотястандарт гласит:

Функция strerror возвращает указатель на строку, содержимое которой
зависит от локали. Указанный массив не должен изменяться программой ,
, но может быть перезаписан последующим вызовом функции strerror.

Существует ли очевидная причина для этой функции возвращать изменяемую строку вместо чего-то вроде:

char const * const strerror(int errnum);  

или, по крайней мере,

char const * strerror(int errnum);

Благодаря.

Ответы [ 3 ]

5 голосов
/ 22 июня 2010

То же, что и для типа строковых литералов: это было уже так в C89, описывая практику, существовавшую до введения const в языке. Изменение этого параметра сделает текущую действительную программу недействительной.

1 голос
/ 26 июня 2010

Ответ о статическом буфере неправильный;является ли возвращаемый тип указателя постоянным или нет, не имеет ничего общего с буфером.Тип возврата полностью о совместимости API с историческим кодом, который не использует const, и в этом нет никакого вреда.Кто-то, пишущий современный const-осведомленный код, просто немедленно использует возвращаемое значение или сохраняет его в переменной указатель на константу.

1 голос
/ 22 июня 2010

Вероятно, это так, потому что многие исторические реализации используют статический буфер, в который они "печатают" строку ошибки.

...