Функция constexpr возвращает глобальную переменную ref или глобальную переменную - PullRequest
0 голосов
/ 08 апреля 2020

Я пишу программу на С ++ на Arduino Nano (старый загрузчик). Я попытался применить этот подход для определения глобальных переменных регистров и другого оборудования. Однако я столкнулся со странным ударом при попытке использовать этот глобальный varialbe внутри функции constexpr. Хотя мой код скомпилирован должным образом в Arduino IDE, и я также проверил результаты (адреса памяти были правильны и т. Д. c), платформаIO соответствовала. Проблема может быть проиллюстрирована следующим кодом:

// globals.h
typedef volatile uint8_t register_t;
extern register_t g_PORTA;
// globals.S
.global g_PORTA
g_PORTA = 0x12
// main.h
class RegWrapper
{
  register_t& reg;
public:
  constexpr RegWrapper(register_t& r) : reg(r) {}
};

struct StaticFieldRef
{
  static constexpr register_t& Port = g_PORTB;  // Works properly
  static constexpr RegWrapper r = RegWrapper(Port);
};

struct ConstexprFunction
{
  static constexpr register_t& Port() // Arduino IDE doesn't complain, but PIO does
  {
    return g_PORTB;
  }
  static constexpr RegWrapper r = RegWrapper(Port());
};
//main.cpp just use the code somehow so it compiles

При попытке вернуть ссылку или указатель на этот глобальный var, не говоря уже о применении более сложного выражения к В операторе return я получаю сообщение об ошибке:

note: 'static constexpr register_t& ConstexprFunction::Port() [with register_t = volatile unsigned char]' is not usable as a constexpr function because:
     static constexpr register_t& Port()
                                  ^
 error: expression 'g_PORTB' has side-effects

Я понимаю, что компилятор считает, что я пытаюсь изменить значение глобальной переменной внутри контекста constexpr, но, как я уже сказал, поведение не соответствует среди pio, arduino ide и clang analyzer.

Я использую плагин deviot для возвышенного текста.

PlatformIO, version 4.3.2a1
(platform: atmelavr; board: nanoatmega328; framework: arduino; build_type: debug)
...