为什么 iconv 函数需要一个非常量输入缓冲区?

Why does the iconv function need a non-const inbuffer?

document of iconv中,函数概要是这样的:

#include <iconv.h>

size_t iconv (iconv_t cd, const char* * inbuf, 
      size_t * inbytesleft, 
      char* * outbuf, 
      size_t * outbytesleft);

但是,当我检查系统中的 iconv.h 时,函数概要是这样的:

extern size_t iconv (iconv_t __cd, char **__restirct __inbuf,
      size_t *__restrict __inbytesleft,
      char **__restirct __outbuf,
      size_t *__restrict __outbytesleft);

这两个函数简介中,一个是const char **,而另一个只是char **。

为什么文档中的功能介绍和我系统中的不一样?为什么 iconv 函数需要一个非常量输入缓冲区?

我的g++版本是6.3.0。

iconv() 的问题是它不是 C 标准的一部分,但它在 两个 不同的标准中指定。其中之一是 POSIX-1.2008:

#include <iconv.h>

size_t iconv(iconv_t cd, char **restrict inbuf,
       size_t *restrict inbytesleft, char **restrict outbuf,
       size_t *restrict outbytesleft);

另一个是SUSv2:

#include <iconv.h>

size_t iconv(iconv_t cd, const char **inbuf, size_t *inbytesleft,
    char **outbuf, size_t *outbytesleft);

它们在 const**inbuf 的本质上有所不同,因此,如果您想在两种标准之间保持可移植性,则必须传递非常量 **inbuf, 不幸的是.

编辑: 由于这是双指针,问题更严重,。简而言之,这些规范在任何一个方向上都不兼容...


您链接为 "document of iconv" 的是 GNU libiconv 的文档,它旨在用于本机不提供 iconv() 的平台——这个显然遵循SUSv2 规范。

您在系统上找到的头文件属于 glibc,您平台的 C 库, 实现遵循 POSIX-1.2008规范.

const char* * inbuf, vs. char **__restirct __inbuf,, I guess. – Sourav Ghosh

确实 - restrict 通知编译器指针对象不会改变。这个声明实际上是这样做的,以便更好地优化生成的代码。

使用 restrict 实际上可能在更高的优化级别上导致最糟糕的代码。

https://godbolt.org/g/uhfVCe