gpt4 book ai didi

c - 在编译时确定数组中的位置

转载 作者:太空宇宙 更新时间:2023-11-04 06:10:24 25 4
gpt4 key购买 nike

有没有办法在 c 的编译时确定 const 数组中的位置?这是我正在尝试做的一个例子:

const unsigned char DATA[] = {
// Part 1
// hundreds or thousands of values

// Part 2
// compiler records this position in the array in PART2
// hundreds or thousands of values

// Part 3
// compiler records this position in the array in PART3
// hundreds or thousands of values

// ...
};

const unsigned int PART_IDX [] = {
// index to Part 1
0,

// index to Part 2
PART2,

// index to Part 3
PART3,

// ...
};

我可以在运行时计算索引,但宁愿让它们已经完成,因为数组是常量。我可以制作一个程序来分析源代码,计算每个部分中的元素数量,并将数据插入 PART_IDX 中,但我真的想让编译器在编译时执行此操作。这样,如果插入或删除数据,或者添加或删除部件,编译器仍会生成正确的代码。有人知道我该怎么做吗?谢谢!

编辑:为澄清起见,使用带有实际数据的示例:

const unsigned char DATA[] = {
// Part 1
0, 1, 2, 3, 4,

// Part 2
// compiler records this position in the array in PART2 (should be 5)
10, 11, 12, 13, 14, 15, 16,

// Part 3
// compiler records this position in the array in PART3 (should be 12)
20, 21, 22
};

const unsigned int PART_IDX [] = {
// index to Part 1
0,

// index to Part 2
PART2, // should be 5, points to 10 in the array

// index to Part 3
PART3, // should be 12, points to 20 in the array
};

问题是,我可以用什么来代替以 // compiler records this position ... 开头的行?让编译器在 PART2 中记录适当的值和 PART3

最佳答案

与其试图强制 C 做一些它不想做的事情,一个更好、更常见的方法是通过编写一个准备数据的程序来为 C 程序准备数据。也就是说,编写一些其他程序来计算部件中的数据并编写初始化 DATAPART_IDX 所需的 C 代码。

另一种选择是:

  • 将每个部分的所有数据放在一个单独的“.h”文件中,例如文件“part1.h”、“part2.h”、“part3.h”。
  • 要初始化 DATA,请将所有这些头文件包含在其初始化列表中。
  • 要计算部分的索引,请使用 sizeof 计算包含前面部分的代理数组中的元素数。

例子:

“part1.h”包含10, 11, 12,

“part2.h”包含20, 21,

“part3.h”包含30, 31, 32, 33,

C 文件是:

const unsigned char DATA[] =
{
#include "part1.h"
#include "part2.h"
#include "part3.h"
};


const unsigned int PART_IDX [] =
{
0,

sizeof (const unsigned char []) {
#include "part1.h"
} / sizeof (const unsigned char),

sizeof (const unsigned char []) {
#include "part1.h"
#include "part2.h"
} / sizeof (const unsigned char),
};


#include <stdio.h>


int main(void)
{
for (int i = 0; i < 3; ++i)
printf("Part %d begins at index %d with value %d.\n",
i, PART_IDX[i], DATA[PART_IDX[i]]);
}

关于c - 在编译时确定数组中的位置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58310045/

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