C++ 如何将constexpr指针指向CMSIS定义的硬件外围设备?

C++ 如何将constexpr指针指向CMSIS定义的硬件外围设备?,c++,constexpr,memory-mapped-io,C++,Constexpr,Memory Mapped Io,我希望尽可能使用constexpr而不是#defines,以实现类型安全和命名空间功能 不幸的是,我得到了这个错误:“reinterpret_cast(1073756160)”在尝试时不是一个常量表达式 #include <stm32f0xx.h> // #defines SPI2 as pointer to a struct of volatile unsigned ints constexpr auto myPort = SPI2; #include/#将SPI2定义为指向易

我希望尽可能使用
constexpr
而不是
#define
s,以实现类型安全和命名空间功能

不幸的是,我得到了这个
错误:“reinterpret_cast(1073756160)”在尝试时不是一个常量表达式

#include <stm32f0xx.h> // #defines SPI2 as pointer to a struct of volatile unsigned ints

constexpr auto myPort = SPI2;
#include/#将SPI2定义为指向易失性无符号整数结构的指针
constexpr auto myPort=SPI2;
我正在寻找解释为什么
reinterperet\u cast
不能在
constexpr
中使用

现代的C++方式有什么对某些内存映射的硬件有一个CONExPR指针?


这样做的一个原因是在模板化代码中使用这些
constepr
值。

constepr
代码不是为了避免使用
\define
s;它的存在是为了让你可以用表达来做一些你无法用其他方式做的事情。例如,您可以将
constexpr
指针或整数作为模板参数传递,因为它们是常量表达式

基本上,任何
constexpr
变量或函数的主要目的都是能够在编译时编程中使用。因此,将变量声明为
constexpr
就是说“这是一个编译时常量,在编译时使用它是合理的。”


值为任意地址的指针不能在编译时使用。因此,将指针标记为编译时值是矛盾的。所以你不被允许这么做
constexpr
指针必须是实指针,它可以是空指针,也可以是指向实际对象的指针。不允许使用任意地址。

这是不可能的。即使是
std::bit_cast
,在某些情况下,当涉及的类型之一是指针时,它可以在编译时模拟
重新解释\u cast

与其他已存在的答案状态一样,不可能对任意指针进行模拟

如果您要求的是“针对某种内存映射硬件的类型安全和命名空间特性[…],那么为什么不直接使用它呢

//假定的前提条件,因为没有提供相关的条件
类型定义结构{
易失性无符号整数a;
易失性无符号整数b;
}SPI_类型定义;
SPI_TypeDef*SPI2=(SPI_TypeDef*)0x12345678;
//实际答案
SPI_TypeDef*const myPort=SPI2;
这样,指向struct SPI_TypeDef类型的某些数据的指针myPort是常量,但不是指向struct的


const
关键字通常为“左赋值”。

错误:无法在初始化中将“SPI_TypeDef*”转换为“volatile unsigned int*const”
您可以提供定义了
SPI2
的代码摘录。我假设它是内存位置(即指针)的一个简单积分
#define
。如果它已经被输入为
SPI\u TypeDef*
,你最好使用
SPI\u TypeDef*const=SPI2
。这正是我想使用
constepr
的原因。我希望能够编写以指针作为模板参数的模板化代码。其中指针点在编译时已知。这就是内存映射硬件的全部要点。从该基址的任何偏移量在编译时也是已知的。当然,这些指针指向的值在编译时是未知的。这就是为什么指针是
constexpr
volatile uint32\u t
。但比较这些指针,例如,绝对可能发生在编译时。@CameronTacklind:但它不是指向任何东西的指针;这只是一个数字。在constexpr编码中,指针不是地址;它们指向物体。C++对象模型在CONTXPR代码中是真实的,所以你不能只做一个数字,假装它是一个有意义的指针。它们只能指向对象或null。“这就是内存映射硬件的全部要点。”你的编译器不能做“内存映射硬件”。@CameronTacklind:如果你“希望能够编写以指针作为模板参数的模板化代码。”-你最好相应地更新你的问题,以获得更好的答案。