j'ai lu que atoi () code> est obsolète et qu'il est équivalent à: (int)strtol(token_start, (char **)NULL, 10);
5 Réponses :
Cela signifie que, à un moment donné, Atoi ne sera plus disponible. Alors commencez à changer votre code maintenant p>
Je reçois cette partie, mais je me demandais si la mise en œuvre d'ATOI vient d'appeler le code ci-dessus.
Ceci est incorrect, la citation nécessaire. Rien dans la norme C actuelle ne indique qu'Ooi est obsolète. Et ceci est 6 ans après que cette réponse a été faite, le C11 étant la norme active.
Il dit que sur Apple's Page manuelle Mac OS X pour ATOI (3) (et dans les pages de l'homme BSD aussi) que La fonction ATOI () a été obsolète par strtol () et ne devrait pas être
utilisé dans le nouveau code. P>
blockquote> J'utiliserais le ATOI code> a été obsolète.
strtol () code> équivalent pour cette raison, mais je doute que vous ayez à vous inquiéter de ATOI () code> être supprimé. p>
de http://www.codecogs.com/library/computing /c/stdlib.h/atoI.php
Notes de mise en œuvre Strike> P> * The atoi function is not thread-safe and also not async-cancel safe.
* The atoi function has been deprecated by strtol and should not be used in new code.
Cela ne dépend-il que sur la mise en œuvre interne du atoi code> s'il s'agit de la sécurité du thread ou non? Sinon, qu'est-ce qui ne le rend pas thread-coffre-fort à l'extérieur?
Ils ont dû essayer très fort de le faire sans fil. La mise en œuvre naïve est sûre.
Il est important de noter que tous les compilateurs ne supporte pas encore les fonctions STO *, comme Android NDK. Voir cette question pour plus: Stackoverflow.com/Questtions/15499070/...
La page Homme Glibc pour Atoi dit: "Les fonctions ATOI (), ATOL () et ATOLL () sont du thread-Safe avec des exceptions. Ces fonctions peuvent être utilisées en toute sécurité dans des applications multithreadées, tant que SetLocale (3) n'est pas appelée changer les paramètres régionaux lors de leur exécution. "
Cette réponse, ou plutôt la source, est incorrecte / non pertinente. Qu'il s'agisse d'une certaine fonction ou non du thread-Safe dépend effectivement de la mise en œuvre du compilateur. Je ne vois pas pourquoi ce ne serait pas. Atoi n'est pas différente des fonctions Strol à cet égard. Plus d'informations, Atoi n'est certainement pas obsolète. Ce n'était pas en 2009 et ce n'est pas non plus non plus, dans la norme C11.
@LUNDIN Je ne peux pas supprimer cette réponse car c'est l'accepté, donc je l'ai mis à jour. J'ai constaté que les pages du BSD et OSX Man disent que cela est obsolète, même si je ne sais pas quelle est la question initiale.
J'ai essayé votre code sur mon compilateur (GCC) et m'a tous deux donné 0 code>, donc je ne vois aucune différence: |
Hmmm, mon mauvais! Merci @sasq. Je pensais strtol code> a dû définir errno code> sur erreur, mais dans le cas spécifique de mon code de test ci-dessus, il ne le fait pas.
@PMG Votre code de test ne semble pas vérifier errno code> du tout.
Non, vous ne devriez pas utiliser ce qui précède au lieu de Vous devez réellement vérifier les informations d'erreur que doit être remplacé par p> atoi code>. strtol code> est disponible: p> < Pré> xxx pré>
Selon la norme C, ATOI équivaut à Strtol comme suit, C11 7.22.1.2: P>
Les fonctions ATOI, ATOL et ATOLL convertissent la partie initiale de la
Chaîne pointée par NPTR à Int, longue int et longue long int
Représentation, respectivement. p>
Sauf pour le comportement sur l'erreur, ils sont équivalents à p>
strtol est préférable, car Atoi invoque un comportement indéfini lors de l'erreur. Voir 7.22.1 "Si la valeur du résultat ne peut pas être représentée, le
le comportement est indéfini. " P> ATOI code> n'est pas obsolète, votre source est incorrecte. Rien dans la norme C actuelle ISO 9899: 2011 indique ceci (voir par exemple le chapitre 6.11 Directions de langue futures), ni quoi que ce soit dans des normes antérieures. P>
ATOI: (int) strtol (NPTR, (Char **) NULL, 10) CODE> P>
atol: strtol (NPTR, (char * **) null, 10) code> p>
ATOLL: STOLL (NPTR (**) NULL, 10) CODE> P>
blockQuote>
(Oui, je sais que cette question est terriblement ancienne mais la réponse acceptée est incorrecte, devait être clarifiée)
"Si la valeur du résultat ne peut pas être représentée, le comportement est indéfini". Cela rendait sûrement la fonction complètement inutilisable et constitue une raison suffisante de considérer la fonction efficacement obsolète.
@Williampursell en effet. Donnez au comité standard C quelques décennies de plus et ils pourraient se rendre compte. Par exemple, il leur a fallu 22 ans pour supprimer obtient code>. L'inculpation même de l'efficacité et de l'initiative. Comparez ceci avec la norme de sous-ensemble Safe-C MISRA-C, qui a interdit toutes les fonctions de l'ATO * dès 1998.
Mon problème avec
atoi code>:assert (aoii ("0")! = Atoi (! Bla ")) code>Atoi code> est faible car il ne fait presque pas de détection d'erreur bien définie, mais même lorsque vous utilisezstrtol code>, détecter correctement les erreurs de détection (et de classification) est étonnamment difficile et aucune des réponses ici traite vraiment de cela. Voir les réponses à Cette question a > Pour certaines directives.