gpt4 book ai didi

c++ - reinterpret_cast(37)' 不是常量表达式

转载 作者:行者123 更新时间:2023-12-01 13:48:08 26 4
gpt4 key购买 nike

gcc无法编译下面的代码,而 clang编译正常。我无法控制宏PORTB ,因为它在第 3 方库 ( avr ) 中。

gcc漏洞?我如何在 gcc 中解决它?作为一种解决方法,可以创建一个从 PORTB 中提取数值的预处理器宏?

请注意,这个问题与我之前的 question 类似,但不完全相同。 .
它也不同于this问题,开发人员可以灵活地更改分配的rhs,从而避免reinterpret_cast .

#include <iostream>
#include <cstdint>

#define PORTB (*(volatile uint8_t *)((0x05) + 0x20))

struct PortB {
static const uintptr_t port = reinterpret_cast<uintptr_t>(&PORTB);
};

int main() {
std::cout << PortB::port << "\n";
return 0;
}

最佳答案

好像 reinterpret_cast is not allowed during compilation .因此,较新版本的编译器只是 more conforming to the language . reinterpret_cast将不允许在 constexpr 的地方是必须的。
但也许这些解决方法可能会有所帮助( compiles with g++ 9.2 ):

#include <iostream>
#include <cstdint>

#define PORTB (*(volatile uint8_t *)((0x05) + 0x20))

struct PortB {
static uintptr_t port;
};

uintptr_t PortB::port = reinterpret_cast<uintptr_t>(&PORTB);
const uintptr_t freePort = reinterpret_cast<uintptr_t>(&PORTB);
#define macroPort reinterpret_cast<uintptr_t>(&PORTB)

int main() {
std::cout << PortB::port << "\n";
std::cout << freePort << "\n";
std::cout << macroPort << "\n";
return 0;
}

关于c++ - reinterpret_cast<volatile uint8_t*>(37)' 不是常量表达式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54174694/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com