Глядя на большинство функций в стандартных библиотеках C, как представляется, предпочтение отдается отсутствию константы, где это указано.Почему стандартные библиотеки C игнорируют корректность const?
Например:
ctype.h/с
extern int isupper(int __c) __ATTR_CONST__;
extern int islower(int __c) __ATTR_CONST__;
extern int isdigit(int __c) __ATTR_CONST__;
Почему не они вместо того, чтобы:
extern int isupper(const int __c) __ATTR_CONST__;
extern int islower(const int __c) __ATTR_CONST__;
extern int isdigit(const int __c) __ATTR_CONST__;
Они только наблюдать параметр после того, как все:
int isupper(int c) {
return _pctype[c] & _UPPER;
}
int islower(int c) {
return _pctype[c] & _LOWER;
}
int isdigit(int c) {
return _pctype[c] & _DIGIT;
}
Или давайте возьмем функцию в string.c:
void *memcpy(void *dest, const void *src, size_t count)
{
char *tmp = dest;
const char *s = src;
while (count--)
*tmp++ = *s++;
return dest;
}
Почему нет:
void *memcpy(void *const dest, const void *const src, size_t count);
ли Const исключен в этих местах по причине?
Неправильно ли включать const, как я показал?
Я предполагаю, что по историческим причинам функции остались такими же,
, но я решил, что должен спросить, если я что-то пропустил.
Эта реализация функции «memcpy», которую вы показываете, - это то, как новички это делают, это не очень оптимально, и выпускная версия программы с использованием «memcpy» не будет использовать такую наивную реализацию (если только компилятор и стандартная библиотека не являются очень глупый). Что касается «функций» классификации символов, они могут быть реализованы как макросы и, как таковые, не могут иметь const-correctness. –
@JoachimPileborg Ну, я этого не писал. Это то, что было в моих новых системных файлах linux distro. –
То, что он намекает, заключается в том, что профессиональные решения, вероятно, будут использовать всю мощность копирования процессора. Например, они могут использовать 'uint_fast8_t' вместо char, а затем уменьшать' count' на 'sizeof (uint_fast8_t)' вместо 1. Мне кажется странным, что вы найдете такую наивную реализацию внутри Linux где-нибудь, 'memcpy' будет как правило, интегрируются в компилятор. – Lundin