【问题标题】:How to Access an Array Element Defined in a Macro如何访问宏中定义的数组元素
【发布时间】:2020-01-11 19:06:52
【问题描述】:

我正在尝试定义一个访问宏中定义的数组元素的 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 } }
                                ~                        ^

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

【问题讨论】:

    标签: c++ macros preprocessor


    【解决方案1】:
    #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 的特定要求的任何变体。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-11-03
      • 1970-01-01
      • 2019-10-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多