Взглянув на страницу руководства в MacOS X 10.6.6, она документирует две функции, atof()
и atof_l()
, и я подозреваю, что дает подсказку о том, почему функция считается поточно-ориентированной:
SYNOPSIS
#include <stdlib.h>
double atof(const char *str);
#include <xlocale.h>
double atof_l(const char *str, locale_t loc);
ОПИСАНИЕ
Функция atof()
преобразует начальную часть указанной строкиот str до двойного представления.
Это эквивалентно:
strtod(str, (char **)NULL);
Символ десятичной точки определен в локали программы (категория LC_NUMERIC).
В то время какФункция atof()
использует текущую локаль, функция atof_l()
может быть передана непосредственно в локаль.См. Xlocale (3) для получения дополнительной информации.
ЗАМЕЧАНИЯ ПО РЕАЛИЗАЦИИ
Функция atof()
не является поточно-ориентированной и не асинхронно-отменяемой-безопасной.
Функция atof()
устарела strtod()
и не должна использоваться в новом коде.
ОШИБКИ
Функция atof()
необходимане влияет на значение errno
при ошибке.
Я подозреваю, что если текущий языковой стандарт изменяется другим потоком во время выполнения функции atof()
, результат не гарантируется.В противном случае, кажется, нет никаких причин для предупреждения.
Я искал определенное местоположение исходного кода библиотеки Darwin C, но не нашел его.Если вы перейдете к исходному коду FreeBSD для atoi()
, станет ясно, что реализация функции тривиальна:
int
atoi(str)
const char *str;
{
return (int)strtol(str, (char **)NULL, 10);
}
(Да, даже без использования прототипного определения!)
На странице справки для strtol()
нет формулировки ласки о безопасности потока или безопасности асинхронной отмены.Однако быстрый взгляд на исходный код strtol()
показывает, что он использует isspace()
, на который влияет локаль:
ISO / IEC 9899: 1999, раздел 7.11.1.1Функция setlocale
187 Единственными функциями в 7.4, на поведение которых не влияет текущий языковой стандарт, являются isdigit и isxdigit.
(Где §7.4 для <ctype.h>
.)
Теперь, хотя я не уверен, что этот код идентичен тому, что в Дарвине (MacOS X), он, вероятно, будет похожим.Я думаю, что на страницах руководства может быть место для ошибок - не очень понятно, является ли страница, которая нуждается в исправлении, страницей для atoi()
или страницей для strtol()
.