0
查看C標準庫中的大多數函數,似乎缺少const,在指定的情況下,通常會首選。爲什麼C標準庫忽略const正確性?
例如:
文件ctype.h/C
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會是錯誤的嗎?
由於歷史原因,我認爲功能一直保持這種方式,
但我想我應該問,以防萬一我錯過了什麼。
那你實現顯示'memcpy'功能是初學者如何做到這一點,它不是很優化,並使用'memcpy'不會用這麼幼稚的實現(除非編譯器和標準庫是非常程序的發佈版本笨)。至於字符分類「功能」,它們可以作爲宏來實現,因此不能具有常量正確性。 –
@JoachimPileborg嗯,我沒有寫它。這就是我新安裝的Linux發行版的系統文件。 –
他暗示的是,專業解決方案可能會利用處理器的整個複製能力。例如,他們可以使用'uint_fast8_t'而不是char,然後用'sizeof(uint_fast8_t)'而不是1來減少'count'。我覺得在Linux的某處會發現這樣一個天真的實現,'memcpy'會通常集成在編譯器中。 – Lundin