xstrtoul()在哪里/如何定义?

时间:2013-06-25 21:55:10

标签: c linux gcc glibc gnu-coreutils

我正在浏览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 个答案:

答案 0 :(得分:2)

好的,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 ++中,有一些文件命名约定用于类似情况,其中模板定义为defined in a .tcc file#included头文件末尾为.hpp