Я пытаюсь узнать что-то о повторных вызовах и пытаюсь использовать _vsnprintf_r()
. Первый параметр кажется каким-то struct _reent *
. На Cygwin кажется, что я мог бы просто использовать это так: _vsnprintf_r (_REENT, /* rest of the arguments here */)
. Это правильно? Это правильно даже за пределами Cygwin? Кажется, для этого не хватает документации. Мои поиски в Google и Bing были не слишком плодотворны.
Как правильно использовать _vsnprintf_r()?
Ответы (2)
_vsnprintf_r
не является стандартной функцией. Он был создан командой разработчиков cygwin для внутреннего использования.
_vsnprintf_r
вызывается обычным vsnprintf
, поэтому я бы придерживался обычной версии C
этого вызова на cygwin. Cygwin не гарантирует, что _vsnprintf_r
в любом случае является реентерабельным, особенно если вы не можете найти документацию об этом.
Поскольку cygwin использует динамически загружаемую библиотеку, которая имеет общее состояние между всеми процессами, которые связываются с ней, он использует _<xxx>_r
версии вызовов, чтобы дать каждому процессу свои собственные экземпляры состояния, которые обычно используются по умолчанию в стандартной системе UNIX. Поскольку эти функции используются cygwin для внутреннего использования, вы можете найти список рассылки cygwin-developers лучшим ресурс для вашего вопроса.
Это отличается от реентерабельных функций, определенных POSIX (например, gmtime_r
). Нереентерабельные версии этих возвращенных указателей на статическую память в библиотеке, поэтому реентерабельные версии были созданы, чтобы позволить функции вместо этого использовать память, переданную вызывающей стороной.
_r
версию.
- person wilx; 15.06.2012
Вы, вероятно, не хотите ничего «печатать» с повторными вызовами, потому что вы не знаете, в каком порядке или когда что-то будет «печатать».
В общих чертах, чтобы писать реентерабельные функции, передайте в функцию все (без статических переменных). Локальные (стековые) переменные в порядке, насколько я знаю.
Печать — «классическая» проблема для семафоров (или какого-либо другого механизма блокировки). В противном случае,
Привет, мир
становится
HeWlorllod
или в лучшем случае
HellWorldo
_
обычно является знаком, который говорит, что не трогайте меня, если вы не взламываете саму библиотеку C. - person Fred Foo   schedule 15.06.2012