2016-02-29 6 views
0

Глядя на большинство функций в стандартных библиотеках 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, как я показал?

Я предполагаю, что по историческим причинам функции остались такими же,
, но я решил, что должен спросить, если я что-то пропустил.

+0

Эта реализация функции «memcpy», которую вы показываете, - это то, как новички это делают, это не очень оптимально, и выпускная версия программы с использованием «memcpy» не будет использовать такую ​​наивную реализацию (если только компилятор и стандартная библиотека не являются очень глупый). Что касается «функций» классификации символов, они могут быть реализованы как макросы и, как таковые, не могут иметь const-correctness. –

+0

@JoachimPileborg Ну, я этого не писал. Это то, что было в моих новых системных файлах linux distro. –

+0

То, что он намекает, заключается в том, что профессиональные решения, вероятно, будут использовать всю мощность копирования процессора. Например, они могут использовать 'uint_fast8_t' вместо char, а затем уменьшать' count' на 'sizeof (uint_fast8_t)' вместо 1. Мне кажется странным, что вы найдете такую ​​наивную реализацию внутри Linux где-нибудь, 'memcpy' будет как правило, интегрируются в компилятор. – Lundin

ответ

7

являются константные подписи.

Вы почти никогда не пишете const до аргументов pass-by-value. Функция получает свою собственную копию, поэтому там нет никакой опасности.

void *memcpy(void *dest, const void *src, size_t count) 

также является константой. Только второй указатель обещает не менять то, на что он указывает. Указатель адресата, с другой стороны, все об изменении того, на что он указывает.