为什么C标准库忽略常量正确性?

为什么C标准库忽略常量正确性?,c,string,constants,const-correctness,ctype,C,String,Constants,Const Correctness,Ctype,查看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

查看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;
}

或者让我们在<强>字符串中使用一个函数。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。 该函数有自己的副本,因此没有危险

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

const也是正确的。只有第二个指针保证不会改变它所指向的内容。另一方面,目标指针完全是关于更改它指向的内容。

您展示的
memcpy
函数的实现是初学者如何实现的,它不是非常理想,并且使用
memcpy
的程序发布版本不会使用这种幼稚的实现(除非编译器和标准库非常愚蠢)。至于字符分类“函数”它们可能被实现为宏,因此不能具有常量正确性。@JoachimPileborg好吧,我没有写它。这就是我新安装的linux发行版的系统文件中的内容。他暗示的是,专业解决方案可能会利用处理器的全部复制能力。例如,他们可以使用
uint\u fast8\u t
而不是char,然后将计数减少
sizeof(uint\u fast8\t)
而不是1。我觉得奇怪的是,你会在Linux的某个地方发现这样一个幼稚的实现,
memcpy
通常会集成在编译器中。顺便说一句,正确的库实现也会使用
restrict
指针。与“const correction”类似,也存在“restrict correction”ISO C要求memcpy具有以下定义:
void*memcpy(void*restrict s1,const-void*restrict s2,size_t n);
我希望这个问题是关于
char*str(const-char*s1,const-char*s2)之类的函数的
返回
const char*s1
中的
char*
表单。