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

Ed *_*wey 0 c++ macros preprocessor

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

数组定义为:

#define NOZZLE_TO_PROBE_OFFSET { 27, 35, -1.5 }
Run Code Online (Sandbox Code Playgroud)

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

#define Z_STEPPER_ALIGN_XY { {  NOZZLE_TO_PROBE_OFFSET[0] , Y_BED_SIZE/2 }, { X_BED_SIZE,  Y_BED_SIZE/2 } }
Run Code Online (Sandbox Code Playgroud)

但我收到以下错误:

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 } }
                                ~                        ^
Run Code Online (Sandbox Code Playgroud)

我无法记住我的宏扩展规则,而且似乎也无法找到正确的谷歌术语来帮助解决这个问题。该消息是有道理的,但我不确定该尝试什么作为表示数组访问的替代方法。我想我想让预处理器做的是嵌入数组文字,然后是访问,这样输出就会扩展到{ 27, 35, -1.5 }[0]我很欣赏这个公认的 n00by 问题的反馈!

wal*_*nut 6

#define NOZZLE_TO_PROBE_OFFSET { 27, 35, -1.5 }
Run Code Online (Sandbox Code Playgroud)

不是数组。宏只进行文本替换和{ 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 };
Run Code Online (Sandbox Code Playgroud)

或任何变体满足您对NOZZLE_TO_PROBE_OFFSET.

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