C++ 如何在类中隐藏寄存器地址

C++ 如何在类中隐藏寄存器地址,c++,driver,cpu-registers,C++,Driver,Cpu Registers,我正在创建一个驱动程序,我已经在类的头文件中声明了这样的寄存器 private: static const uint32_t REG1 = (0x00000000); static const uint32_t REG2 = (0x00000004); static const uint32_t REG3 = (0x00000008); static const uint32_t REG4 = (0x0000000c); static const uint32_t REG5 = (0x0000

我正在创建一个驱动程序,我已经在类的头文件中声明了这样的寄存器

private:

static const uint32_t REG1 = (0x00000000);
static const uint32_t REG2 = (0x00000004);
static const uint32_t REG3 = (0x00000008);
static const uint32_t REG4 = (0x0000000c);
static const uint32_t REG5 = (0x00000010);
// etc ...
然后在我的.cpp中,我做了以下工作:

const uint32_t Class::REG1;
const uint32_t Class::REG2;
const uint32_t Class::REG3;
const uint32_t Class::REG4;
const uint32_t Class::REG5;

有人告诉我,我需要隐藏寄存器值,不要将它们放入头中。执行此操作的最佳方法是什么?

一种方法是将它们放在类的源文件中的匿名命名空间中,从标头和类中完全删除它们:

namespace /*no name mean it's an anonymous namespace*/ {
    const uint32_t REG1 = ( 0x00000000);
    /*etc*/
}
我已经放下了静电,也不再需要了


这样,它们将只能从特定的编译单元访问。

一种方法是将它们放在类的源文件中的匿名命名空间中,将它们完全从头和类中删除:

namespace /*no name mean it's an anonymous namespace*/ {
    const uint32_t REG1 = ( 0x00000000);
    /*etc*/
}
我已经放下了静电,也不再需要了


这样,它们将只能从特定的编译单元访问。

您始终可以在实现源代码中初始化常量

标题:

private:

    static const uint32_t REG1;
    static const uint32_t REG2;
    static const uint32_t REG3;
    static const uint32_t REG4;
    static const uint32_t REG5;
实施cpp:

const uint32_t Class::REG1 = (0x00000000);
const uint32_t Class::REG2 = (0x00000004);
const uint32_t Class::REG3 = (0x00000008);
const uint32_t Class::REG4 = (0x0000000c);
const uint32_t Class::REG5 = (0x00000010);

这样,常量仍然是类的静态成员,值在实现部分。这样,如果类实现在多个编译单元中分离,您仍然可以使用它们,而无需在header事件中定义值。

您始终可以在实现源中初始化常量

标题:

private:

    static const uint32_t REG1;
    static const uint32_t REG2;
    static const uint32_t REG3;
    static const uint32_t REG4;
    static const uint32_t REG5;
实施cpp:

const uint32_t Class::REG1 = (0x00000000);
const uint32_t Class::REG2 = (0x00000004);
const uint32_t Class::REG3 = (0x00000008);
const uint32_t Class::REG4 = (0x0000000c);
const uint32_t Class::REG5 = (0x00000010);

这样,常量仍然是类的静态成员,值在实现部分。这样,如果类实现在多个编译单元中分开,您仍然可以使用它们,而无需在header事件中定义值。

这些地址是仅由您自己的类使用还是也由其他编译单元使用?您是否可以将示例扩展到可编译类?这些地址是否仅由您自己的类或其他编译单元使用?你能把你的例子扩展到一个可编译的类吗?我使用静态的,因为我不希望每个对象都有自己的变量。我猜现在每个对象都会?一个对象怎么会得到一个甚至在对象类中都没有声明的东西的副本?@5gon12eder我相信这就是OP对Bathsheba的回答感到困惑的地方,它们位于全局空间,在第一个对象被创建时创建,在应用程序终止时销毁?它们具有静态存储持续时间,在程序启动时初始化,在程序退出时取消初始化。但由于它们只是普通的旧整数,编译器只需将它们的值放在可执行文件的常量数据部分,值就在那里。如果您从不获取它们的地址,编译器甚至可能将它们全部省略,并在使用变量时替换该值。它们不在全局名称空间中,因为放在匿名名称空间中。我使用静态名称空间,因为我不希望每个对象都有自己的变量。我猜现在每个对象都会?一个对象怎么会得到一个甚至在对象类中都没有声明的东西的副本?@5gon12eder我相信这就是OP对Bathsheba的回答感到困惑的地方,它们位于全局空间,在第一个对象被创建时创建,在应用程序终止时销毁?它们具有静态存储持续时间,在程序启动时初始化,在程序退出时取消初始化。但由于它们只是普通的旧整数,编译器只需将它们的值放在可执行文件的常量数据部分,值就在那里。如果您从不获取它们的地址,编译器甚至可能将它们全部省略,并在使用变量时替换该值。它们不在全局命名空间中,因为放在匿名命名空间中。