Я прочитал все сообщения на эту тему.Понятно, что вы не можете использовать статические переменные в constexpr, так как они не известны до времени ссылки.Однако я не понимаю, почему компилятор не позволит создать статический указатель на действительно статический адрес.
Мы конвертировали наш код в C ++ 11 из-за «многих преимуществ для встроенного программирования».Эта конкретная проблема вызывает беспокойство.Вот различные попытки заставить это работать.
#define PERIPH_BASE 0x40000000U
#define GPIOH_BASE (AHB1PERIPH_BASE + 0x1C00U)
#define GPIOH ((GPIO_TypeDef *) GPIOH_BASE)
#define KBATH_NFAULT_GPIO_Port GPIOH
// Attempt #1
const GPIO_TypeDef* KBATH_NFAULT_GPIO_Port = (GPIO_TypeDef*)GPIOH_BASE;
constexpr DigitalInput BathNFaultK {const_cast<GPIO_TypeDef*>
(KBATH_NFAULT_GPIO_Port), BATH_NFAULT_Pin};
// Attempt #2
constexpr GPIO_TypeDef* KBATH_NFAULT_GPIO_Port = (GPIO_TypeDef*)GPIOH_BASE;
constexpr DigitalInput BathNFaultK {KBATH_NFAULT_GPIO_Port, BATH_NFAULT_Pin};
// Attempt #3
#define STM_PERIPH(a) __builtin_constant_p (a) ? a : a
constexpr DigitalInput BathNFaultK {
STM_PERIPH((GPIO_TypeDef*)GPIOH_BASE), BATH_NFAULT_Pin};
// Attempt #4
static constexpr inline GPIO_TypeDef* STM_GPIO_PORT(GPIO_TypeDef* p){
return __builtin_constant_p((p))?(p):(p);
}
constexpr DigitalInput BathNFaultK {
const_cast<GPIO_TypeDef*>(STM_GPIO_PORT(BATH_NFAULT_GPIO_Port)),
BATH_NFAULT_Pin
};
В обычном «С» это приемлемо.Есть ли решение?Это исправлено в C ++ 17?
Спасибо