2010-06-22 81 views
1

我只是略读了C99标准,当我发现从strerror函数(7.12.6.2节)返回的指针不是const限定的时,我正在寻找一些我现在不记得的东西,即使标准说:为什么strerror不会返回一个const限定的指针?

strerror函数返回一个指向该字符串,其内容是
语言环境而异。 指向的数组不应该被程序,
修改,但可能会被后续对strerror函数的调用覆盖。

是否有一个明显的原因函数返回修改字符串,而不是像一些:

char const * const strerror(int errnum); 

或者至少是

char const * strerror(int errnum); 

感谢。

+2

我想你的意思是只返回'const char *'。指针本身属于调用者,改变它的值没有任何危害。 – u0b34a0f6ae 2010-06-22 21:41:54

+0

@ kaizer.se当然,谢谢。 – manneorama 2010-06-23 07:28:37

回答

5

与字符串文字类型相同:在C89中已经是这样了,描述了一种可以追溯到const在语言中引入之前的练习。改变它会使当前有效的程序无效。

+0

是的,这是有道理的,我有一个预感。该标准的旧版本中不会有#define const解决这个问题吗? (我完全明白为什么不想这样做,我只是问:)) – manneorama 2010-06-22 20:19:10

+0

@manneorama:const int foo = 5; – tomlogic 2010-06-22 23:02:34

+0

@manneorama,问题是没有接受关键字常量在实现中不会有它,它是分配或将strerror或字符串文字的结果分配给char *。正如任何人为C++所知道的那样,改进const正确性是很痛苦的。 – AProgrammer 2010-06-23 05:15:21

1

这可能是因为许多历史实现使用静态缓冲区,他们“打印”错误字符串。

1

关于静态缓冲区的响应是错误的;返回的指针类型是否为const与缓冲区无关。返回类型完全是关于API与不使用const的历史代码的兼容性,并且没有任何伤害。有人编写现代的const-aware代码会立即使用返回值或将其存储到指向const变量的指针中。

+0

重读该问题:指向的数组不应该被程序修改,但可能会被随后对strerror函数的调用覆盖。 – ninjalj 2010-06-27 11:47:27

+1

重读我的答案。一个静态缓冲区可能被用来实现strerror(尽管这是愚蠢的,因为你可能只是返回一个指向二进制文件或mmap'd本地化文件中的常量错误字符串的指针),但是否使用可写的静态缓冲区完全没有与函数的返回类型有关。 const和non-const指针都可以指向非const缓冲区,在这种情况下使用的“right”类型是const。非const的唯一原因是为了迎合那些想要将结果放入非const指针变量或函数参数的遗留常量未知代码。 – 2010-06-28 05:54:05

相关问题