如何访问宏中定义的数组元素

How to Access an Array Element Defined in a Macro

我正在尝试定义一个 C++ 头文件来访问在宏中定义的数组元素。

数组定义为:

#define NOZZLE_TO_PROBE_OFFSET { 27, 35, -1.5 }

我正在尝试像这样访问它,以获得第一个元素:

#define Z_STEPPER_ALIGN_XY { {  NOZZLE_TO_PROBE_OFFSET[0] , Y_BED_SIZE/2 }, { X_BED_SIZE,  Y_BED_SIZE/2 } }

但我收到以下错误:

Marlin/src/gcode/calibrate/../../inc/../../Configuration_adv.h:659:57: error: expected '}' before '[' token
   #define Z_STEPPER_ALIGN_XY { {  NOZZLE_TO_PROBE_OFFSET[0] , Y_BED_SIZE/2 }, { X_BED_SIZE,  Y_BED_SIZE/2 } }
                                ~                        ^

我在记住我的宏扩展规则时遇到了麻烦,而且似乎也无法召唤正确的 google 术语来帮助解决这个问题。该消息是有道理的,但我不确定要尝试使用什么替代方法来表示数组访问。我想我希望预处理器做的是嵌入数组文字,然后是访问,这样输出就会扩展到类似 { 27, 35, -1.5 }[0] 我感谢对这个公认的 n00by 问题的反馈!

#define NOZZLE_TO_PROBE_OFFSET { 27, 35, -1.5 }

不是数组。宏只做文本替换, { 27, 35, -1.5 } 最多是数组的初始化列表,但可能是任何其他语法构造,具体取决于使用它的上下文。无论如何,它本身就没有数组。您不能从中提取一个元素。

我建议您将所有宏替换为实际的 arrays/tuples/vectors,可能 constconstexpr 合格,例如:

auto NOZZLE_TO_PROBE_OFFSET = std::array<double, 3>{ 27., 35., -1.5 };

// or since C++17
auto NOZZLE_TO_PROBE_OFFSET = std::array{ 27., 35., -1.5 };

或满足您对 NOZZLE_TO_PROBE_OFFSET.

的特定要求的任何变体

如果有其他方法可以解决问题,则应尽量避免使用宏。