Где и как определяется xstrtoul()?
Я просматривал код для ls.c
и заметил звонок xstrtoul()
, Я хотел выяснить, где именно была определена эта полезная функция. Это привело меня к xstrtol.h
, который имеет следующий фрагмент:
# 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.c
является __xstrtol()
, который имеет следующую подпись:
strtol_error
__xstrtol (const char *s, char **ptr, int strtol_base,
__strtol_t *val, const char *valid_suffixes)
Я предполагаю, что каким-то образом компилятор отображает несколько экземпляров этой функции каждый раз с другим именем, замененным на __xstrtol
и другой тип для __strtol_t
, Но я не понимаю, где и как это делается. (Есть только #define
для каждого из этих двух наверху xstrtol.c
).
1 ответ
Хорошо, xstrtol.c
Файл - это место, где функция действительно определена, но этот исходный файл включен в другие исходные файлы, действуя как шаблон функции C++, для генерации функций с немного другими именами и поведением.
Посмотрите на xstrtoul.c. На самом деле он включает в себя xstrtol.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
файл в другой .c
файл.
В C++ существуют соглашения об именах файлов, используемые для аналогичной ситуации, когда определения шаблонов определяются в .tcc
файл, который #included
в конце .hpp
заголовочный файл