Я бы догадался, потому что альтернатива была хуже. Предположим, что прототип был изменен, чтобы добавить const
:
long int strtol(const char *nptr, const char **endptr, int base);
Теперь предположим, что мы хотим проанализировать непостоянную строку:
char str[] = "12345xyz"; // non-const
char *endptr;
lont result = strtol(str, &endptr, 10);
*endptr = '_';
printf("%s\n", str); // expected output: 12345_yz
Но что происходит, когда мы пытаемся скомпилировать этот код? Ошибка компилятора! Это довольно не интуитивно понятно, но вы не можете неявно преобразовать char **
в const char **
. См. C ++ FAQ Lite для подробного объяснения причин. Там технически говорится о C ++, но аргументы в равной степени действительны и для C. В C / C ++ вам разрешено неявно преобразовывать только указатель « тип » в «указатель const
* 1015». * введите"на самом высоком уровне: вы можете выполнить преобразование из char **
в char * const *
или, что эквивалентно, из" указателя на (указатель на char
) "на" указателя на (const
указатель на char
)».
Поскольку я предполагаю, что разбор неконстантной строки гораздо более вероятен, чем разбор константной строки, я продолжу постулировать, что const
-неправильность в маловероятном случае предпочтительнее, чем в общем случае ошибка компилятора .