Можно ли использовать glibc sprintf в реентерабельной функции? - PullRequest
0 голосов
/ 05 января 2011

Могу ли я использовать sprintf в реентерабельной функции, если она пишет в локальный буфер?Как то так:

void reentrant_function () { 
    int i = 4;
    char buffer[20];
    snprintf(buffer, 20, "%d", i); 
}

Ответы [ 3 ]

4 голосов
/ 07 октября 2011

Я попадаю на эту страницу, потому что я тоже задаю тот же вопрос. Вот что я прочитал из книг:

Расширенное программирование в среде UNIX: второе издание

Раздел 10,6

Большинство функций, которых нет на рисунке 10.4 (список реентерабельных функций) отсутствуют, потому что (a) известно, что они используют статические структуры данных, (b) они вызывают malloc или free, или ( c) они являются частью стандартной библиотеки ввода-вывода .

Интерфейс программирования Linux

Глава 21.1.2

Функции также могут быть не входящими, если они используют статические структуры данных для своих внутренняя бухгалтерия. Наиболее очевидными примерами таких функций являются члены библиотеки stdio (printf (), scanf () и т. д.), которая обновляет внутренние данные структуры для буферизованного ввода / вывода.

Я полагаю, это зависит от реализации. Это также зависит от того, как вы используете snprintf на самом деле (буфер необходим). Самый безопасный ответ на вопрос должен быть «нет».

2 голосов
/ 05 января 2011

Конечно, вы можете, если ваш buffer не static.

2 голосов
/ 05 января 2011

Да.

Почему вы думаете, что не могли? Там нет глобальных.

Одна мысль: буфер является локальным для функции, зачем вам форматировать строку и ничего с ней не делать?

...