小编And*_*art的帖子

为什么两个 using 子句解析为同一类型在 gcc 中被视为模棱两可

我有两个带有 using 子句的基类

 class MultiCmdQueueCallback {
  using NetworkPacket  = Networking::NetworkPacket;
  ....
 }


 class PlcMsgFactoryImplCallback {
   using NetworkPacket = Networking::NetworkPacket;
  ....
 }
Run Code Online (Sandbox Code Playgroud)

然后我声明一个类

class PlcNetwork : 
  public RouterCallback, 
  public PlcMsgFactoryImplCallback, 
  public MultiCmdQueueCallback {
  private:
    void sendNetworkPacket(const NetworkPacket &pdu);
}
Run Code Online (Sandbox Code Playgroud)

编译器然后标记对“NetworkPacket”的错误引用是不明确的“sendNetworkPacket(NetworkPacket &...”

现在,两个“使用子句”都解析为相同的底层类 Networking:NetworkPacket

事实上,如果我将方法声明替换为:

 void sendNetworkPacket(const Networking::NetworkPacket &pdu);
Run Code Online (Sandbox Code Playgroud)

它编译得很好。

为什么编译器将每个 using 子句视为不同的类型,即使它们都指向相同的底层类型。这是标准规定的还是我们有编译器错误?

c++ using-declaration

31
推荐指数
3
解决办法
1704
查看次数

如何设置constexpr指针指向物理地址

在嵌入式编程中,您经常需要设置指向物理地址的指针.该地址不可重定位并已修复.这些不是由链接器设置的,因为它们通常代表寄存器或在这种情况下位于OPT存储器中预定地址的校准数据.当芯片制造商首次在生产中测试器件时,设置该数据.

所以第一次尝试是:

static constexpr uint16_t *T30_CAL = reinterpret_cast<uint16_t *>(0x1FFFF7B8u);
Run Code Online (Sandbox Code Playgroud)

但这导致GCC下面的警告/错误,并且根据标准(c ++ 14)是"非法的".

..xyz/xxxx/calibration.cpp:23:40:错误:从整数到指针的reinterpret_cast

现在我可以捏造它

constexpr uint32_t T30_ADDR = 0x1FFFF7B8u;
static constexpr inline uint16_t *T30_CAL(){ 
  return reinterpret_cast<uint16_t *>(T30_ADDR);
}
Run Code Online (Sandbox Code Playgroud)

编译没有警告,但......

我想GCC可以选择将其编译为函数而不是constexpr,尽管它每次都会内联这个函数.

这样做有更简单,更符合标准的方法吗?

对于嵌入式代码,这些定义始终是必需的,因此如果有一种不需要函数定义的简单方法,那就太好了.

对前面问题的回答通常会得出一个答案,说明标准中不允许这样做,并将其留在那里.

这不是我想要的.我需要一种使用C++生成编译时常量指针到固定地址的兼容方式.我想在不使用Macros的情况下这样做,因为我的代码会使用强制转换器导致问题导致问题.这导致需要在多个地方而不是一个地方获得合规性例外.每个例外都是一个过程,需要时间和精力.

Constexpr在嵌入式系统上保证常量放在.text段(flash)中,而const则不放置.text段(flash).它可以放在有价值的ram中,并由.bss启动代码初始化.通常,嵌入式设备具有比RAM更多的闪存.此外,访问RAM中变量的代码通常效率低得多,因为它通常涉及嵌入式目标(如ARM)上至少两次内存访问.一个用于加载变量的RAM地址,另一个用于从变量的位置加载实际的常量指针值.Constexpr导致常量指针直接编码到指令流中或导致单个恒定负载.

如果这只是一个单独的实例,那就不是问题了,但是你通常有很多不同的外设,每个都通过自己的寄存器组进行控制,然后这就成了问题.

许多嵌入式代码最终会读写外设寄存器.

c++ gcc pointers constexpr c++14

8
推荐指数
1
解决办法
946
查看次数

标签 统计

c++ ×2

c++14 ×1

constexpr ×1

gcc ×1

pointers ×1

using-declaration ×1