Ceci est très spécifique et un peu difficile à expliquer, et très probablement impossible, mais voilà.
Je veux mettre en œuvre La voie naïve à faire est: p> La norme de cette façon, donné Quelques logiques dans le reste de la bibliothèque, le statut FPU ne doit être interrogé que si la dernière fonction de la bibliothèque appelée était en réalité un en utilisant em> le FPU, et la valeur de jusqu'à présent, tout va bien. Mais c'est l'inverse qui me donne des maux de tête: p> La valeur de ne vois pas un moyen d'éviter cela (c'est-à-dire avoir le Mais peut-être que l'une d'entre vous a donc une idée brillante? P> P> P> errno code> selon le cas. Cela stipule le FPU dans des applications math-lourdes. P>
errno code> en faisant une macro à la place: p>
errno code> est uniquement "défini" lorsque sa valeur est réellement demandée: p>
errno code > est réellement demandé em>. p>
errno code> n'est pas demandée du tout. mais
__ errno () code> ne sait pas cela et interrogera le statut FPU si la dernière fonction de la bibliothèque appelée utilisait le FPU. em>
errno code> macro ou le
__ errno () code> fonctionne en quelque sorte fonctionner différemment selon qu'ils sont utilisés à gauche ou à la droit de l'opérateur d'affectation), et je suis presque content d'accepter cela. P>
3 Réponses :
Aucune idée brillante ici, mais Afaik doit appeler à Selon la norme, si Ce que je ferais, c'est faire le signalement des erreurs facultatif via des directives de préprocesseur et permettre au programmeur de définir la valeur de errno code> est autorisé à être mis en œuvre via des appels de fonction pour effectuer des implémentations de fil de sécurité de la bibliothèque standard possible. Je ne pense pas que l'interrogation du FPU Lazily est une bonne idée: Comment éviterez-vous une incohérence dans des situations comme celle-ci: p>
ERRNO CODE> LI>
errno code> li>
__ errno () code> effacer les drapeaux ou non? p>
errno code> doit être défini par les fonctions mathématiques est déterminé par la valeur de
math_errhandling code> (spécifiquement,
math_errhandling & math_errno < / code>). p>
math_errhandling code> au moment de la compilation. Cela signifierait que les fonctions mathématiques ne peuvent pas être compilées de manière statique mais doivent résider dans un en-tête, ce qui pourrait être une bonne idée de toute façon pour permettre aux compilateurs sans optimisations de temps de liaison à ces fonctions. P>
Ce que vous avez ici est une analyse assez bonne de la raison pour laquelle l'ensemble du mécanisme La forme fonctionnelle de Votre macro devrait probablement avoir des parenthèses autour de celui-ci pour la sécurité: P> errno code> est si insatisfaisant. Vous pouvez trouver une analyse similaire dans la "bibliothèque standard C" de Kernighan.
errno code> est également nécessaire pour les implémentations de fil-sécurité, où différents threads ont des valeurs d'erreur distinctes accessibles via un Spécifique du fil
errno code>. p>
#define errno (*__errno())
Plus d'un commentaire qu'une réponse, mais sans formatage de code, il ne serait pas compréhensible.
Si vous vérifiez la paresseuse des drapeaux FPU, comment auriez-vous le comportement correct (les fonctions mathématiques sont spéciales en ce sens qu'ils sont garantis ne pas modifier errno quand il n'y a pas de problème)? P>
errno = 0; x = acos(y); z = <exp>; if (errno != 0) { /* can't come here even if y is a valid argument but <exp> modified the flags if it didn't call any functions */ }