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

问题描述 投票:0回答:1

我正在尝试定义一个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问题的反馈!

c++ macros preprocessor
1个回答
3
投票
#define NOZZLE_TO_PROBE_OFFSET { 27, 35, -1.5 }

不是数组。该宏仅执行文本替换,并且{ 27, 35, -1.5 }最多是数组的初始化列表,但取决于使用它的上下文,可能还有其他语法构造。无论如何,固有地没有数组。您不能从中提取一个元素。

我建议您将所有宏替换为实际的数组/元组/向量,可能是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的特定要求的变体。

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

© www.soinside.com 2019 - 2024. All rights reserved.