C++11 什么是现代C++;如何让constexpr const指针指向嵌入式应用程序的易失性内存位置?

C++11 什么是现代C++;如何让constexpr const指针指向嵌入式应用程序的易失性内存位置?,c++11,casting,c++17,volatile,C++11,Casting,C++17,Volatile,在构建用于在嵌入式微处理器上控制硬件的库时,一项常见任务是操纵特定内存位置的位以控制硬件功能 在AVR处理器中,Atmel(现在的Microchip)提供了可扩展为以下内容的宏: 这可以实现以下功能: 现在在C++11(及更新版本)中,希望用constepr替换几乎所有#define的用法 在GCC C++编译器的旧版本中(4.9),以下编译: #include <avr/io.h> constexpr volatile uint8_t *const PortA = &P

在构建用于在嵌入式微处理器上控制硬件的库时,一项常见任务是操纵特定内存位置的位以控制硬件功能

在AVR处理器中,Atmel(现在的Microchip)提供了可扩展为以下内容的宏:

这可以实现以下功能:

现在在C++11(及更新版本)中,希望用
constepr
替换几乎所有
#define
的用法

在GCC C++编译器的旧版本中(4.9),以下编译:

#include <avr/io.h>
constexpr volatile uint8_t *const PortA = &PORTA;
我不想解释为什么不能在
constepr
上下文中使用
reinterpret\u cast
,或者为什么整数到指针的转换是非法的

<现代> C++ > < <代码> CONTXPRPR <代码>指针>代码> > Value<代码>内存的正确方法是什么?< /强> < /P> 我见过一些建议,建议将
PORTA
的内存地址存储在
constexpr uintptpr\t
中,然后
在运行时将其重新解释为
volatile uint8\t*const
,以便进行位操作

例如,这可以正常工作,甚至可以按照预期编译为
avr gcc
中的单个
sbi
指令。


我无法重现您的错误消息
错误:重新解释从整数到指针的转换
。我的编译器(g++7.3.0)发出了一条不同的消息-
错误:“volatile uint8*{aka volatile unsigned char*}”类型的值“37”不是常量表达式
。这也是非常奇怪的…将
volatile uint8\u t&PortA=PortA做你想做的事?@IgorTandetnik这可能是我错过的一件简单的事情。我不知道为什么我以前没有试过。我会尝试更多的东西,然后回来。
PORTA |= 1;
#include <avr/io.h>
constexpr volatile uint8_t *const PortA = &PORTA;
error: reinterpret_cast from integer to pointer
#include <stdint.h>
constexpr uintptr_t PortA = 0x25;
void set() { *((volatile uint8_t *)(PortA)) |= 1; }
const char str[] = "FooBar";
constexpr const char * x = str + 2;