gpt4 book ai didi

c++ - self 背后的理论和用法是什么,包括 C 和 C++ 中的源文件?

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:22:58 25 4
gpt4 key购买 nike

请引用这个FASTLZ.C源代码。

  • 在#113 和#128 行,它包含了自己的源文件。

我认为它的目的是根据它们的 FASTLZ_LEVEL 宏值定义两个函数名称。

#define FASTLZ_COMPRESSOR fastlz1_compress
#define FASTLZ_DECOMPRESSOR fastlz1_decompress
static FASTLZ_INLINE int FASTLZ_COMPRESSOR(const void* input, int length, void* output);
static FASTLZ_INLINE int FASTLZ_DECOMPRESSOR(const void* input, int length, void* output, int maxout);
#include "fastlz.c"

#define FASTLZ_COMPRESSOR fastlz2_compress
#define FASTLZ_DECOMPRESSOR fastlz2_decompress
static FASTLZ_INLINE int FASTLZ_COMPRESSOR(const void* input, int length, void* output);
static FASTLZ_INLINE int FASTLZ_DECOMPRESSOR(const void* input, int length, void* output, int maxout);
#include "fastlz.c"

但我无法弄清楚C 语言中这个宏背后的理论或关键特征,有人可以简要解释一下这种情况吗?

最佳答案

这定义了两对函数,称为 faSTLz1_compressfaSTLz1_decompress,以及 faSTLz2_compressfaSTLz2_decompress。这两个压缩函数非常相似,只是这里和那里有几行,解压缩函数也类似。发生两次的自包含是为了消除这两对函数定义中的重复。

以下是文件内容的缩略版:

#if !defined(FASTLZ__COMPRESSOR) && !defined(FASTLZ_DECOMPRESSOR)

...
#undef FASTLZ_LEVEL
#define FASTLZ_LEVEL 1

#undef FASTLZ_COMPRESSOR
#undef FASTLZ_DECOMPRESSOR
#define FASTLZ_COMPRESSOR fastlz1_compress
#define FASTLZ_DECOMPRESSOR fastlz1_decompress
static FASTLZ_INLINE int FASTLZ_COMPRESSOR(const void* input, int length, void* output);
static FASTLZ_INLINE int FASTLZ_DECOMPRESSOR(const void* input, int length, void* output, int maxout);
#include "fastlz.c"

#undef FASTLZ_LEVEL
#define FASTLZ_LEVEL 2

#undef MAX_DISTANCE
#define MAX_DISTANCE 8191
#define MAX_FARDISTANCE (65535+MAX_DISTANCE-1)

#undef FASTLZ_COMPRESSOR
#undef FASTLZ_DECOMPRESSOR
#define FASTLZ_COMPRESSOR fastlz2_compress
#define FASTLZ_DECOMPRESSOR fastlz2_decompress
static FASTLZ_INLINE int FASTLZ_COMPRESSOR(const void* input, int length, void* output);
static FASTLZ_INLINE int FASTLZ_DECOMPRESSOR(const void* input, int length, void* output, int maxout);
#include "fastlz.c"

...

#else /* !defined(FASTLZ_COMPRESSOR) && !defined(FASTLZ_DECOMPRESSOR) */

static FASTLZ_INLINE int FASTLZ_COMPRESSOR(const void* input, int length, void* output)
{
...
#if FASTLZ_LEVEL==2
...
#endif
...
#if FASTLZ_LEVEL==1
...
#else
...
#endif
...
}

static FASTLZ_INLINE int FASTLZ_DECOMPRESSOR(const void* input, int length, void* output, int maxout)
{
...
#if FASTLZ_LEVEL==2
...
#endif
...
#if FASTLZ_LEVEL==1
...
#else
...
#endif
...
}

#endif

包含 #if block 的文件的第一部分包含一系列宏定义,但您会注意到它们被定义了两次。包含 #else block 的文件的第二部分基本上包含一对函数模板。

第一部分定义了一些宏,然后包含了自身。自包含时,#else部分生效。这根据 FASTLZ_COMPRESSORFASTLZ_DECOMPRESSOR 宏定义了 faSTLz1_compressfaSTLz1_decompress。因为 FASTLZ_LEVEL 设置为 1,这会激活 faSTLz1_compressfaSTLz1_decompress 特定代码。

第一次自包含后,这些宏是未定义的,然后为faSTLz2_compressfaSTLz2_decompress重新定义,然后文件再次自包含。于是再次拉入了#else部分,不过这次的效果是定义了faSTLz2_compressfaSTLz2_decompress,具体这些函数的代码由于 FASTLZ_LEVEL 现在设置为 2 而被激活。

一种稍微不那么令人困惑的方法是将外部 #if#else 之间的所有内容都放在一个文件中,而 # 之间的部分else#endif 在另一个文件中。

更好的方法是创建一个压缩函数和一个解压缩函数,每个函数都接受一个参数来指定级别,而不是使用宏技巧。例如:

static FASTLZ_INLINE int fastlz_compress(const void* input, int length, void* output, int level)
{
...
if (level==2) {
...
}
...
if (level==1) {
...
} else {
...
}
...
}

关于c++ - self 背后的理论和用法是什么,包括 C 和 C++ 中的源文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48322527/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com