gpt4 book ai didi

C++,用define声明一个数组;怎么了? (简单快捷)

转载 作者:行者123 更新时间:2023-11-28 02:33:36 24 4
gpt4 key购买 nike


我正在尝试学习一些 C++,但我遇到了这段代码:

static const unsigned char t_CountBits13[8192] = {
#define B2(n) n, n+1, n+1, n+2
#define B4(n) B2(n), B2(n+1), B2(n+1), B2(n+2)
#define B6(n) B4(n), B4(n+1), B4(n+1), B4(n+2)
#define B8(n) B6(n), B6(n+1), B6(n+1), B6(n+2)
#define B10(n) B8(n), B8(n+1), B8(n+1), B8(n+2)
#define B12(n) B10(n), B10(n+1), B10(n+1), B10(n+2)
B12(0), B12(1)
};

我觉得这很奇怪!
问题 1:这是否与:

#define B2(n) n,     n+1,     n+1,     n+2
#define B4(n) B2(n), B2(n+1), B2(n+1), B2(n+2)
#define B6(n) B4(n), B4(n+1), B4(n+1), B4(n+2)
#define B8(n) B6(n), B6(n+1), B6(n+1), B6(n+2)
#define B10(n) B8(n), B8(n+1), B8(n+1), B8(n+2)
#define B12(n) B10(n), B10(n+1), B10(n+1), B10(n+2)

static const unsigned char t_CountBits13[8192] = {B12(0), B12(1)};

问题 2:

#define B2(n) n,     n+1,     n+1,     n+2

我认为 C++ 函数只能返回一个值是否正确?因为看起来你在这里定义了一个返回多个的函数(例如 lua)

亲切的问候!

最佳答案

答案 1:数组将使用相同的值进行初始化。预处理后的结果在空格方面看起来会有些不同,因此在文本上不一样,但编译的结果应该是相同的。

答案2:如评论中所述,这些不是C++函数,而是C预处理器解释的宏。这些导致在编译器解释它之前进行文本扩展。您示例中的扩展太大,无法在此处显示(2 * 4^6 = 8192 个元素很多)。我将减少它作为一个例子。

原始源代码:

static const unsigned char data[] = {
#define B2(n) n, n+1
#define B4(n) B2(n), B2(n+1)
B4(1), B4(2)
};

预处理器的输出(例如,gcc -E tst.c 的输出:

# 1 "tst.c"
# 1 "<command-line"
# 1 "/usr/include/stdc-predef.h" 1 3 4
# 1 "<command-line" 2
# 1 "tst.c"
static const unsigned char data[] = {


1, 1 +1, 1 +1, 1 +1 +1, 2, 2 +1, 2 +1, 2 +1 +1
};

注意预处理指令所在的空行。另请注意,这些值不是算术结果,而是文本扩展。这是编译器将实际解释的代码。另请注意,扩展是通过 #define 递归的。上面定义的宏。

# 开头的行是来自预处理器的附加信息,包括命令行定义和文件信息等内容。它在这个例子中相当平淡,但如果你有一个 #include <somefile.h>你会看到它的内容,它包含的文件的内容(递归地),以及一些 # lines 指示这些位置的实际行号(编译器通常使用它来显示警告和错误消息,因为当它得到它时,曾经是第 5 行的行现在可能是第 2592 行,但你会期望警告指示第 5 行)。

查看预处理器的输出对于调试奇怪的错误非常有帮助。当来自编译器的消息没有意义时,它可能是一个错误的 #define 替换了您没有预料到的文本。例如,您可能有以下代码

int limit(int x) {
if (x > LIMIT) {
return LIMIT;
}
return x;
}

编译器可能会说 error: expected identifier or '(' before numeric constant在线int limit(int x) {

如果您查看预处理后的输出,您可能会发现

int 5(int x) {

并意识到以下行已进入您的代码(原始源文件或包含文件)

#define limit 5

注意如何 limit是小写字母,我们尝试命名一个函数,但预处理器将其替换为 5。 #define应该是 LIMIT (全部大写)

这个回答有点长,但我希望能说明 #define 的文本替换性质s 和一些有关查找您自己的代码的中间表示的提示。

注意:预处理器的实际输出取决于您的工具链。以上信息适用于 GNU 编译器集合。一些工具链实际上并没有将预处理器阶段与编译阶段分开,而是简单地表现得好像它们分开了,这是语言允许的。

关于C++,用define声明一个数组;怎么了? (简单快捷),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28290008/

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