为什么 C 标准库忽略 const 的正确性?
Why do C standard libraries neglect const correctness?
查看 C 标准库中的大多数函数,似乎缺少 const,通常首选指定 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被排除在这些地方是有原因的吗?
以我展示的方式包含 const 会不会是错误的?
我认为由于历史原因,功能一直保持这种状态,
但我想我应该问一下,以防我错过了什么。
那些是 const-correct 签名。
你几乎从不在传值参数前写 const 。
该函数有自己的副本,所以那里没有危险。
void *memcpy(void *dest, const void *src, size_t count)
const 也是正确的。只有第二个指针承诺不会改变它指向的内容。另一方面,目标指针就是改变它指向的内容。
查看 C 标准库中的大多数函数,似乎缺少 const,通常首选指定 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被排除在这些地方是有原因的吗?
以我展示的方式包含 const 会不会是错误的?
我认为由于历史原因,功能一直保持这种状态,
但我想我应该问一下,以防我错过了什么。
那些是 const-correct 签名。
你几乎从不在传值参数前写 const 。 该函数有自己的副本,所以那里没有危险。
void *memcpy(void *dest, const void *src, size_t count)
const 也是正确的。只有第二个指针承诺不会改变它指向的内容。另一方面,目标指针就是改变它指向的内容。