0

のコードを調べていて、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)。

4

1 に答える 1

2

OK、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

于 2013-06-25T23:11:03.560 に答える