2013-06-25 2 views
0

ls.c 코드를 조사한 결과 xstrtoul()으로 전화를 알았습니다. 나는이 유용한 함수가 정확히 어디에 정의되어 있는지 알아 내고 싶었다. 나는이 상황을 제대로 이해한다면/xstrtoul()은 어디에 정의되어 있습니까?

# define _DECLARE_XSTRTOL(name, type) \ 
    strtol_error name (const char *, char **, int, type *, const char *); 
_DECLARE_XSTRTOL (xstrtol, long int) 
_DECLARE_XSTRTOL (xstrtoul, unsigned long int) 
_DECLARE_XSTRTOL (xstrtoimax, intmax_t) 
_DECLARE_XSTRTOL (xstrtoumax, uintmax_t) 

, 전처리 통과 후 결과 함수 프로토 타입은 다음과 같습니다 :

strtol_error xstrtoul (const char *, char **, int, unsigned long int *, \ 
                    const char *); 

그러나, 유일한 관련 함수를 정의 이것은 다음 코드를 가지고있는, xstrtol.h를 알려준

strtol_error 
__xstrtol (const char *s, char **ptr, int strtol_base, 
      __strtol_t *val, const char *valid_suffixes) 

내 생각 엔 그 어떻게 든 일이다 xstrtol.c에 다음 서명이 __xstrtol()입니다 e 컴파일러는이 함수의 여러 인스턴스를 매번 __xstrtol으로 대체 된 다른 이름과 __strtol_t을 다른 유형으로 매핑합니다. 그러나 나는 이것이 어디서 어떻게 이루어 졌는지 이해하지 못합니다. (xstrtol.c의 맨 위에는이 두 가지 각각에 대해 #define 만 있습니다.) 함수가 정말 정의된다

답변

2

OK는 xstrtol.c 파일이지만,이 소스 파일 약간 다른 이름 및 행동 기능을 생성하는 C++ 함수 템플릿처럼 행동, 다른 소스 파일에 포함되어 있습니다.

xstrtoul.c을 살펴보십시오. 실제로 xstrtol.c 포함하지만, 템플릿 함수 생성 수정하는 여러 처리기 기호를 정의 : 다른 .c 파일로 .c 파일을 포함

#define __strtol strtoul 
#define __strtol_t unsigned long int 
#define __xstrtol xstrtoul 
#define STRTOL_T_MINIMUM 0 
#define STRTOL_T_MAXIMUM ULONG_MAX 
#include "xstrtol.c" 

그것은 (전대 미문의는 아니지만) 이례적인합니다. C++에서

는 템플릿에 정의 .hpp 헤더 파일의 끝에 #includeddefined in a .tcc file있는 유사한 상황에 사용되는 파일의 명명 규칙이있다.

+0

정보 주셔서 감사합니다. coreitils의 debuginfo를 살펴 보았는데, 단지 하나의 xstrtol.c 파일 만 있고, git tree와 같은 온 가족은 아닙니다. – Meta

관련 문제