gpt4 book ai didi

arrays - 从宏函数中提取 __VA_ARGS__ 时初始化数组

转载 作者:行者123 更新时间:2023-12-05 08:45:57 25 4
gpt4 key购买 nike

我正在尝试为数组数据冗余编写一个特殊的类型处理。这个想法是在编译时全局定义和声明一个固定大小的数组,但每个声明的数组的大小都不同。这是想法:

array[N] = { el1, el2, el3, ..., elN };

起初,我使用了下面的语法,效果很好:

#define ARRAY_DEFDEC(name, size, ...) \
int arr_##name[size] = { __VA_ARGS__ }

当我使用这个宏时,我得到了预期的结果:

// C code
ARRAY_DEFDEC(array_test, 7, 1, 2, 3, 4, 5, 6, 7);
// Preprocessed
int arr_array_test[7] = { 1, 2, 3, 4, 5, 6, 7 };

现在,对于我遇到的问题,不知道是否可以解决。在执行此操作时,我还需要创建第二个数组,所有值都将被反转(使用 ~ 运算符或(0 - 元素 + 1))。我试过 ~VA_ARGS,但自然地,它只会改变第一个元素(在上面的 arr_array_test 示例中,我将得到 -2、2、3、4、5、6、7)。

  • 是否有可能以某种方式将 ~ 运算符应用于所有 __VA_ARGS__

我有一个解决方案可以执行以下操作:

#define ARRAY_DEFDEC(name, size, ...)
int arr_##name[2*size] = { __VA_ARGS__ };

然后它将按以下方式使用:

ARRAY_DEFDEC(test, 7, 1, 2, 3, 4, 5, 6, 7, ~1, ~2, ~3, ~4, ~5, ~6, ~7)

这将需要更改相当多的逻辑,并且用户需要知道除了初始化元素外,还需要提供二进制逆,所以我不太喜欢这样做。

此刻我假设参数大小与大小相同(__VA_ARGS__)。

数组旨在用作全局定义(因为它们需要被多个函数访问)。

注意:由于是嵌入式系统,不能包含外部库。系统上没有单一的标准库(例如 stdio、stdarg、stdint 等)。这也进一步限制了选项。使用的标准是 C99,编译器来自 Green Hill Software。

最佳答案

Is it possible somehow to apply the ~ operator to all VA_ARGS?

不,您必须根据参数数量重载宏。

从一个允许在每个参数上应用函数 f 的通用 FOREACH 宏开始,这是一个最多 3 个参数的示例:

#define FOREACH_1(f, x)  f(x)
#define FOREACH_2(f, x, ...) f(x) FOREACH_1(f,__VA_ARGS__)
#define FOREACH_3(f, x, ...) f(x) FOREACH_2(f,__VA_ARGS__)
#define FOREACH_N(_3,_2,_1,N,...) FOREACH_##N
#define FOREACH(f, ...) FOREACH_N(__VA_ARGS__,3,2,1)(f, __VA_ARGS__)

然后您将定义数组并定义第二个倒置数组。

// note the comma
#define INVERT(x) ~x,
#define ARRAY_DEFDEC(name, ...) \
int arr_##name[] = { __VA_ARGS__ }; \
int secondarr_##name[] = { FOREACH(INVERT, __VA_ARGS__) };

ARRAY_DEFDEC(name, 1, 2, 3)

关于arrays - 从宏函数中提取 __VA_ARGS__ 时初始化数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70864893/

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