のコードを調べていて、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
(の上部にある 2 つのそれぞれにしかありませんxstrtol.c
)。