2016-02-29 26 views
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會是錯誤的嗎?

由於歷史原因,我認爲功能一直保持這種方式,
但我想我應該問,以防萬一我錯過了什麼。

+0

那你實現顯示'memcpy'功能是初學者如何做到這一點,它不是很優化,並使用'memcpy'不會用這麼幼稚的實現(除非編譯器和標準庫是非常程序的發佈版本笨)。至於字符分類「功能」,它們可以作爲宏來實現,因此不能具有常量正確性。 –

+0

@JoachimPileborg嗯,我沒有寫它。這就是我新安裝的Linux發行版的系統文件。 –

+0

他暗示的是,專業解決方案可能會利用處理器的整個複製能力。例如,他們可以使用'uint_fast8_t'而不是char,然後用'sizeof(uint_fast8_t)'而不是1來減少'count'。我覺得在Linux的某處會發現這樣一個天真的實現,'memcpy'會通常集成在編譯器中。 – Lundin

回答

7

那些常量,正確的簽名。

你幾乎從來沒有寫常量傳遞按值參數。 該函數獲取自己的副本,所以在那裏沒有危險。

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

也是常量正確的。只有第二個指針承諾不會改變它指向的內容。另一方面,目標指針就是改變它指向的內容。