2011-01-05 7 views

Répondre

2

Bien sûr, vous pouvez, sauf si votre buffer est static.

+4

Cette réponse est peut-être juste, mais ce n'est pas évident. La norme n'exige pas de reentrant 'snprintf' (ce qui est une exigence beaucoup plus forte que le simple thread-safe). Si la glibc le rend réentrant, cela dépasse les exigences de la norme. –

2

Oui.

Pourquoi pensez-vous que vous ne pouviez pas? Il n'y a pas de global. Une chose à dire: le tampon est local à la fonction, pourquoi voudriez-vous formater une chaîne et ne rien faire avec?

+0

- Je ne savais pas si l'implémentation de snprintf utilisait des données statiques. Répondre à votre deuxième question: Je prévois d'écrire le tampon sur un socket en utilisant send() que je suppose être également réentrant (je dois aussi m'occuper d'errno). Ai-je raison dans cette hypothèse? –

4

J'arrive à cette page parce que je pose aussi la même question. Voici ce que je lis des livres:

Programmation avancée dans l'environnement UNIX: deuxième édition

Section 10.6

La plupart des fonctions qui ne sont pas à la figure 10.4 (une liste des fonctions de rentrants sont manquants car (a) ils sont connus pour utiliser des structures de données statiques, (b) ils appellent malloc ou free, ou (c) ils font partie de la bibliothèque d'E/S standard .

L'interface de programmation Linux

Chapitre 21.1.2

Les fonctions peuvent également être non réentrants si elles utilisent des structures de données statiques pour leur comptabilité interne . Les exemples les plus évidents de telles fonctions sont les membres de la bibliothèque stdio (printf(), scanf(), et ainsi de suite), qui mettent à jour les données internes structures pour les E/S tamponnées.

Je suppose que c'est la mise en œuvre en fonction. Cela dépend aussi de la façon dont vous utilisez réellement snprintf (le tampon est essentiel). La réponse la plus sûre à la question devrait être «non».