Как получить доступ к элементу массива, определенному в макросе - PullRequest
0 голосов
/ 11 января 2020

Я пытаюсь определить заголовочный файл 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] Я благодарен за отклик на этот заведомо n00 вопрос!

1 Ответ

6 голосов
/ 11 января 2020
#define NOZZLE_TO_PROBE_OFFSET { 27, 35, -1.5 }

не является массивом. Макрос выполняет только замену текста, а { 27, 35, -1.5 } - это самое большее список инициализатора для массива, но, вероятно, любая другая грамматическая конструкция в зависимости от контекста, в котором он используется. В любом случае, в нем нет массива по своей сути. Вы не можете извлечь из него один элемент.

Я предлагаю вам заменить все макросы действительными массивами / кортежами / векторами, потенциально const или constexpr, например:

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 };

или любой другой вариант, удовлетворяющий указанным c требованиям, предъявляемым к NOZZLE_TO_PROBE_OFFSET.

. Макросы в основном следует избегать, если есть другие способы решения проблемы.

...