Активация определенного макроса в классе из main.cpp

Извините, если этот вопрос был задан. Я пытаюсь активировать определенную функцию в классе с помощью макроса, определенного в классе из main.cpp. Я использую библиотеку jrowberg MPU6050, если это имеет значение.

main.cpp

#include "gyro.h"
gyro gyro(Serial);
#define OUTPUT_READABLE_EULER

void setup(){
...
}
void loop(){
...
}

gyro.cpp

  #include "gyro.h"
  #ifdef OUTPUT_READABLE_EULER
      // display Euler angles in degrees
      mpu.dmpGetQuaternion(&q, fifoBuffer);
      mpu.dmpGetEuler(euler, &q);
      serial_.print("euler\t");
      serial_.print(euler[0] * 180/M_PI);
      serial_.print("\t");
      serial_.print(euler[1] * 180/M_PI);
      serial_.print("\t");
      serial_.println(euler[2] * 180/M_PI);
  #endif

Если я определяю OUTPUT_READABLE_EULER в gyro.h, он работает. Но я хочу сделать это из main.cpp.

, 👍2

Обсуждение

Попробуйте поместить определение перед включением файла., @Delta_G


1 ответ


1

Вы не можете этого не делать, но также не следует пытаться определить макрос в файле cpp и использовать его в другом файле cpp.

Вместо этого вы должны определить его в файле h (заголовок), который включен в оба файла cpp.

Почему бы вам определить это в main.cpp или main.h в любом случае, если вы не используете его в этих файлах?

У вас есть в основном три варианта:

  • Определите его в gyro.h, чтобы включить его в gyro.cpp где вы его используете. Позже вы можете использовать его и в других файлах.
  • Определите это в gyro.cpp таким образом, вы можете использовать его только в этом файле. Это предотвращает использование макроса в других файлах (что может быть безопаснее).
  • Определите его в отдельном файле, например euler.h, и включите этот файл заголовка везде, где он вам нужен.

Смотрите также комментарии Юрая ниже.

,

это применимо, если определение должно содержаться в исходном файле. этот тип определений обычно устанавливается в командной строке компилятора как-D. в Arduino IDE нет-D, определяющей конфигурацию для проекта., @Juraj

@Juraj в этом случае можно было бы создать определенный файл заголовка с этими макросами (в данном случае один) и включить их в каждый файл., @Michel Keijzers

ДА. именно так, если макрос должен использоваться только в файлах скетча (проекта). неудобно это для библиотек. затем пользователь должен перейти в папку библиотеки и изменить там файл, но тогда это применимо ко всем проектам. если параметр относится к конкретным платам или у вас есть индивидуальное определение платы для проекта, то-D можно задать в boards.local.txt как build.extra_flags. например, в Eclipse-D можно установить в настройках проекта, @Juraj

@Juraj Спасибо за дополнительную информацию. Однако, я думаю, это не работает в среде IDE ?(поскольку IDE Arduino не основана на eclipse), @Michel Keijzers