为什么 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 实际上可能在更高的优化级别上导致最糟糕的代码。
在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 实际上可能在更高的优化级别上导致最糟糕的代码。