, 그것은 두 가지 기능 atof()
및 atof_l()
를 문서화하고, 그 함수가 스레드 안전하지 것으로 간주 이유에 대한 힌트를 제공합니다 의심 :
SYNOPSIS
#include <stdlib.h>
double atof(const char *str);
#include <xlocale.h>
double atof_l(const char *str, locale_t loc);
DESCRIPTION
atof()
함수는 str이 가리키는 문자열의 처음 부분을 double 표현으로 변환합니다.
strtod(str, (char **)NULL);
가 소수점 문자가 프로그램의 로케일 (카테고리 LC_NUMERIC)에 정의되어 있습니다 :에
은 동일합니다.
atof()
함수는 현재 로캘을 사용하지만 atof_l()
함수는 로캘을 직접 전달할 수 있습니다. 자세한 내용은 xlocale (3)을 참조하십시오.
구현 노트
atof()
기능은 스레드 안전 비동기 취소 안전하지도하고 있지 않습니다.
atof()
함수는 strtod()
에 의해 사용되지 않으며 새 코드에서 사용하면 안됩니다.
에러
기능 atof()
오류에 errno
의 가치에 영향을 미칠 필요가 없다.
내 의심은 atof()
기능이 실행되는 동안 현재 로케일이 다른 스레드에 의해 변경되는 경우, 결과가 보장되지 않는다는 점이다. 그렇지 않으면, 경고의 이유가없는 것 같습니다.
나는 Darwin C 라이브러리 소스 코드의 확실한 위치를 찾았지만 찾지 못했습니다. 당신이 atoi()
에 대한 FreeBSD의 소스 코드에 갈 경우, 기능 구현이 사소한 것이 분명하다 :
int
atoi(str)
const char *str;
{
return (int)strtol(str, (char **)NULL, 10);
}
(예, 심지어 프로토 타입 정의를 사용하지!)
이
strtol()
에 대한 매뉴얼 페이지는하지 않습니다 실 안전 또는 비동기 취소 안전에 관한 족제비를 사용하십시오. 9899
ISO/IEC : 그러나, strtol()
의 소스 코드 얼핏는 로케일에 의해 영향을 isspace()
, 사용을 보여줍니다 1999 년 제 7.11.1.1은 setlocale 기능을
187 현재 로켈에서 동작이 영향을받지 않는 7.4의 유일한 함수는 isdigit 및 isxdigit입니다.
(§7.4이 <ctype.h>
을위한입니다.) 이제
,이 코드는 다윈 (맥 OS X)에 무엇이 동일한 지 모르겠어요 동안, 유사 될 가능성이 높습니다. 맨 페이지에 정오표가있을 수 있다고 생각합니다. 수정이 필요한 페이지가 atoi()
또는 strtol()
의 페이지인지 여부는 명확하지 않습니다.애플의 libc의
atoi()
의
흥미로운 질문 ... – ChristopheD
대부분의 atoi 구현은 마치 strtol 래퍼입니다. – Anycorn
이 질문의 제목이 적어도 유효한 질문이되도록 변경했습니다. –