Где и как определяется 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 заголовочный файл

Другие вопросы по тегам