Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/133.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何正确使用_vsnprintf_r()?_C++_C_Windows_Cygwin_Reentrancy - Fatal编程技术网

C++ 如何正确使用_vsnprintf_r()?

C++ 如何正确使用_vsnprintf_r()?,c++,c,windows,cygwin,reentrancy,C++,C,Windows,Cygwin,Reentrancy,我试图学习一些关于重入调用的知识,并尝试使用\u vsnprintf\u r()。第一个参数似乎是某个struct\u reent*。在Cygwin上,我似乎可以这样使用它:\u vsnprintf\u r(\u REENT,/*此处的其余参数*/)。这是正确的吗?即使在Cygwin之外,这也是正确的吗?似乎缺少这方面的文档。我的Google和Bing搜索没有太多成果。\u vsnprintf\u r不是一个标准功能。它由cygwin开发团队创建,供内部使用 \u vsnprintf\u r由常

我试图学习一些关于重入调用的知识,并尝试使用
\u vsnprintf\u r()
。第一个参数似乎是某个
struct\u reent*
。在Cygwin上,我似乎可以这样使用它:
\u vsnprintf\u r(\u REENT,/*此处的其余参数*/)
。这是正确的吗?即使在Cygwin之外,这也是正确的吗?似乎缺少这方面的文档。我的Google和Bing搜索没有太多成果。

\u vsnprintf\u r
不是一个标准功能。它由cygwin开发团队创建,供内部使用

\u vsnprintf\u r
由常规的
vsnprintf
调用,因此我会坚持在cygwin上使用此调用的常规
C
版本。cygwin无法保证
\u vsnprintf\u r
无论如何都是可重入的,尤其是当您找不到任何关于它的文档时

由于cygwin使用一个动态加载的库,该库在链接到它的所有进程之间共享状态,因此它使用调用的
\uu r
版本为每个进程提供自己的状态实例,这通常是标准UNIX系统上的默认状态。由于cygwin在内部使用了这些函数,因此您可能会找到更好的问题资源


这与POSIX定义的可重入函数不同(如
gmtime\r
)。这些返回指针的非可重入版本指向库中的静态内存,因此创建可重入版本是为了允许函数使用调用者传入的内存。

您可能不想用重入调用“打印”任何内容,因为您不知道“打印”的顺序或时间

一般来说,要编写可重入函数,请将所有内容传递到函数中(无静态变量)。本地(堆栈)变量是可以接受的

打印是信号量(或其他一些锁定机制)的“经典”问题。否则,

你好 世界

变成

海洛德

或者充其量


HellWorldo

该功能可能在任何其他平台上都不存在。前导的
\uu
通常是一个标志,上面写着“除非你正在攻击C库本身,否则不要碰我”。这不是“了解可重入调用”的方法。这是了解cygwin丑陋的实现内部的一种方式。如果您正在考虑编写一个标准库的实现,那么阅读cygwin源代码可能会很有教育意义(可能是为了了解在编写自己的代码时不应该做什么),但是如果您只是想学习编写可重入代码,它非常简单:不要使用任何非常量静态/全局变量。已知vsnprintf有rentrant版本吗?这意味着它正在修改一个公共资源(dest字符数组)。对vsnprintf的调用介于va_start()和va_end()之间。一个相关的讨论线索:假设我有理由不使用非
\r
版本。@wilx:Fair!我编辑了答案,建议将cygwin开发者邮件列表作为更好的资源。谢谢大家。可重入性与线程并发性略有不同。