如何正确使用_vsnprintf_r()?

时间:2012-06-15 14:08:13

标签: c++ c windows cygwin reentrancy

我正在尝试了解有关重入调用的内容,我正在尝试使用_vsnprintf_r()。第一个参数似乎是一些struct _reent *。在Cygwin上,似乎我可以像这样使用它:_vsnprintf_r (_REENT, /* rest of the arguments here */)。它是否正确?即使在Cygwin之外,这是否正确?似乎缺乏这方面的文件。我的Google和Bing搜索效果不佳。

2 个答案:

答案 0 :(得分:2)

_vsnprintf_r不是标准函数。它由cygwin开发团队创建,供内部使用。

常规_vsnprintf_r会调用vsnprintf,因此我会坚持在cygwin上使用此调用的常规C版本。 cygwin无法保证_vsnprintf_r无论如何都是可重入的,特别是如果你找不到任何关于它的文档。

由于cygwin使用动态加载的库,该库在链接它的所有进程之间具有共享状态,因此它使用_<xxx>_r版本的调用为每个进程提供自己的状态实例,这些实例通常是默认的标准的UNIX系统。由于cygwin在内部使用这些函数,您可能会发现cygwin-developers mailing list更适合您的问题。

这与POSIX定义的可重入函数(如gmtime_r)形成对比。这些返回指针的非重入版本指向库中的静态内存,因此创建了可重入版本,以允许函数使用调用者传入的内存。

答案 1 :(得分:-1)

您可能不希望通过重入电话“打印”任何内容,因为您不知道什么顺序或什么时候会“打印”。

一般而言,要编写可重入函数,将所有内容传递给函数(无静态变量)。本地(堆栈)变量是好的AFAIK。

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

您好 世界

变为

HeWlorllod

或充其量

HellWorldo