小编Cam*_*ind的帖子

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

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

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

#define PORTA (*(volatile uint8_t *)(0x25))
Run Code Online (Sandbox Code Playgroud)

这可以实现以下功能:

PORTA |= 1;
Run Code Online (Sandbox Code Playgroud)

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

在旧版本的 GCC C++ 编译器 (4.9.2) 中,编译了以下内容:

#include <avr/io.h>
constexpr volatile uint8_t *const PortA = &PORTA;
Run Code Online (Sandbox Code Playgroud)

在8.2.0版本中,上面的代码无法编译并给出错误:

error: 'reinterpret_cast<volatile uint8_t* {aka volatile unsigned char*}>(37)' is not a constant expression
Run Code Online (Sandbox Code Playgroud)

我不是在寻找解释为什么不能reinterpret_castconstexpr上下文中使用或者为什么整数到指针的转换是非法的。

在现代 C++ 中拥有constexpr指向内存的指针的正确方法是什么?volatile

我见过一些建议,将 a 的内存地址存储PORTA在 a 中constexpr uintptr_t,然后在运行时reinterprect_cast进行位volatile uint8_t * const操作。

例如,这可以工作,甚至可以按预期编译为单个sbi指令。avr-gcc …

casting volatile c++11 c++17

9
推荐指数
1
解决办法
498
查看次数

G++ 模板实例化导致“未定义的引用”错误

最近,我的自定义编写的通用矢量代码遇到了一些问题,该代码依赖于功能模板。我不愿意将实现包含在头文件中(这在模板中很常见),因为这会显着增加编译时间。因此,我在 .cpp 文件中手动实例化所需的类。然而,这仍然会导致未定义的参考错误。我已将代码缩减为以下代码片段,但仍然会生成错误:

矩阵d.cpp

#include "matrixd.h"

namespace math
{
    template class _vec2<float>;
    template<class T> _vec2<T>::_vec2() {}
}
Run Code Online (Sandbox Code Playgroud)

矩阵d.h

#pragma once
namespace math
{ 
    template <class T>
    class _vec2
    {
    public:
        T x, y;
        _vec2<T>();
        void reset();
    };

    typedef _vec2<float> vec2;
}
Run Code Online (Sandbox Code Playgroud)

测试.cpp

#include "matrixd.h"

int main()
{
    math::_vec2<float> v;
}
Run Code Online (Sandbox Code Playgroud)

错误信息:

在函数main': source.cpp:(.text+0x10): undefined reference to math::_vec2::_vec2()'collect2: 错误: ld 返回 1 退出状态

任何帮助,将不胜感激!:)

c++ templates g++ undefined-reference

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

标签 统计

c++ ×1

c++11 ×1

c++17 ×1

casting ×1

g++ ×1

templates ×1

undefined-reference ×1

volatile ×1