- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
在 XSH 2.9.1 , wctomb
被列为不需要线程安全的函数之一。但是,相反的转换函数 mbtowc
没有出现在列表中。在使用移位状态的编码的实现中,两者都没有线程安全的 API,并且要求一个是线程安全的而另一个不是是没有意义的,而如果不禁止状态编码,两者都不是线程安全的。
wcstombs
(在列表中)和 mbstowcs
(不在列表中)也是如此。由于这两个函数都对以初始移位状态开始和结束的整个字符串进行操作,因此它们不是有状态的,它们的 API 是线程安全的,同样,指定一个方向是线程安全的而不是指定方向是线程安全的也是没有意义的其他。
任何人都可以阐明这一点吗?
最佳答案
正如您在问题中指出的那样,wctomb
具有或至少被允许具有(隐藏的)“转换状态”:参见 http://pubs.opengroup.org/onlinepubs/009695399/functions/wctomb.html并将其与 wcrtomb
进行比较:http://pubs.opengroup.org/onlinepubs/009695399/functions/wcrtomb.html它有一个明确的“状态”指针。
POSIX 基本上允许程序员将 wctomb
实现为对 wcrtomb
的调用,使用 static
变量来保存移位状态。如果该变量不是每线程项目,它将不是线程安全的。
(所有这些都非常明显并且包含在您的问题中,为了清楚起见,我只是在这里重复它)
请注意,wctomb
没有任何参数可以让您对隐藏的移位状态(如果有的话)进行任何形式的显式控制。具体来说,您不能将其重置为开始状态。
但是现在看看mbtowc
:http://pubs.opengroup.org/onlinepubs/009695399/functions/mbtowc.html文字说:
For a state-dependent encoding, this function is placed into its initial state by a call for which its character pointer argument, s, is a null pointer. Subsequent calls with s as other than a null pointer shall cause the internal state of the function to be altered as necessary. A call with s as a null pointer shall cause this function to return a non-zero value if encodings have state dependency, and 0 otherwise. If the implementation employs special bytes to change the shift state, these bytes shall not produce separate wide-character codes, but shall be grouped with an adjacent character.
也就是说,它们为您提供了一种检测和控制隐藏状态(如果存在)的显式方法。因此,即使它存在并且不是特定于线程的,您也可以照原样“进行自己的控制”。
虽然我不能发誓,但我认为这就是为什么 mbtowc
没有被列为非线程安全的原因。
(不过,这不是我在标准中编写文本的方式!话又说回来,如果我按照自己的方式行事,很多这些功能甚至都不存在。:-))
关于c - 为什么 POSIX 将 wctomb 指定为非线程安全的,而不是 mbtowc?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4785300/
我想计算文件中的字符(在各种字符集中),我正在使用函数“mbtowc”来检测字符。我无法弄清楚为什么字符和结果值不同。这是我的例子: char buf[BUFFER_SIZE + MB_LEN_MAX
我确实在文件系统中搜索不可移植的名称中的字符。为此,使用 mbtowc 函数检查每个字符。 在 OSX 上我试过: //在 OSX 上 #include using namespace std; i
根据 gcc 手册,选项 -fwide-exec-charset在编译时指定宽字符串和字符常量的宽字符集。 但是在运行时通过调用 mbtowc() 将多字节字符转换为宽字符时,宽字符集是什么? POS
在 XSH 2.9.1 , wctomb 被列为不需要线程安全的函数之一。但是,相反的转换函数 mbtowc 没有出现在列表中。在使用移位状态的编码的实现中,两者都没有线程安全的 API,并且要求一个
我正在尝试使用 boost 1-49 的序列化库编译一个 android 应用程序。具体来说,这个项目有一些方便的脚本来完成工作:https://github.com/MysticTreeGames/
根据 C99 规范 mbrtowc函数返回0 if the next n or fewer bytes complete the multibyte character that correspond
我是一名优秀的程序员,十分优秀!