【问题标题】:initialize specific array elements using macros使用宏初始化特定的数组元素
【发布时间】:2018-10-25 11:37:19
【问题描述】:

我有要在预处理期间加载的数据文件。

DATAFILE :
CAR(C1, C2, C3)

可以有 n 辆汽车 (C1, C2....Cn),目前是 3。 C1,.. 是具有特定值的枚举字段,例如 C1=5、C2-8、c3-10。

我想将此数据填充到汽车数组CAR_SUPPORTED[MAX_CARS] 中,这样

CAR_SUPPORTED[C1] = 1 and similarly for C2,C3.. so on.

我尝试了可变参数宏:

int CAR_SUPPORTED[] ={
#define  CAR(...) __VA_ARGS__};
#include "car.data"

但这可能只是将 5, 8, 10 复制到 0,1,2 索引。

我将如何编写一个宏,例如 CAR_SUPPORTED[C1] = 1 等等。 有什么建议吗?

【问题讨论】:

  • int CAR_SUPPORTED[MAX_CARS] ={ ==> int CAR_SUPPORTED[] ={ 让编译器计算元素的数量。
  • 为什么给出这个问题 -1 ?不是要求有效的编程逻辑吗?

标签: c c-preprocessor variadic-macros


【解决方案1】:

只需使用带指示符的数组初始化:

#define CAR(C1, C2, C3) [C1] = 1, [C2] = 1, [C3] = 1 };

如果您将其用于可变参数数,我将使用P99 或增强预处理器宏,或者您可以自己编写宏扩展。使用 boost 获取示例:

#include <boost/preprocessor.hpp>

#define CAR_ONE(r, data, elem)     [elem] = 1,
#define CAR(...) BOOST_PP_SEQ_FOR_EACH(CAR_ONE,,BOOST_PP_VARIADIC_TO_SEQ(__VA_ARGS__)) };

CAR(A1, A2, A3)

【讨论】:

  • 我试图在 boost 中查找实现,它是一个 Marcos 的网络。有点迷路了 :(
  • here 的示例相同,但更大更多。没必要理解,呵呵。而且 P99 更简单。
猜你喜欢
  • 2020-03-31
  • 2016-07-15
  • 2019-02-09
  • 1970-01-01
  • 2015-01-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-10-10
相关资源
最近更新 更多