【问题标题】:Use Public Variable Globally全局使用公共变量
【发布时间】:2010-07-06 15:44:06
【问题描述】:

我正在尝试修改 MIPS 模拟器以在运行时显示其寄存器的内容。我的问题是指我计划这样做的方式。所以...

我有一个文件,file1.cpp 和 file2.cpp。 file1.cpp 中有一个名为

的局部公共变量
typedef long ValueGPR;
ValueGPR reg[33];

我想在 file2.cpp 中访问。这些文件中的每一个都有一个头文件。 File2.cpp 包含一个函数,该函数通过指令迭代跟踪程序指令的执行,使其成为插入 printf("REG[%d]:%d\n",i,reg[i]); 的完美位置。声明或类似的东西,但 reg 是 file1.cpp 中的局部变量。如何将允许我访问此 reg 变量的内容拼接在一起?

这是两个文件的实际样子(在考虑了更多之后): "文件1.h"

typedef long ValueGPR;
...
class ThreadContext {
    ...
    public:
        ValueGPR reg[33];
        ...
    ...
}
...

“文件2.cpp”

...
#include ".../ThreadContext.h"
...
long ExecutionFlow::exeInst(void) {
    ...
    //ADD PRINTF OF reg[1] - reg[32] HERE
    ...
}
...

【问题讨论】:

  • 糟糕,我搞砸了我的描述......所以,reg 用于 file1.cpp 但它在 file1.h 中以下列方式定义:typedef long ValueGPR; public: ValueGPR reg[33];
  • 所以,如果是这种情况,我可以替换 public: ValueGPR reg[33];使用外部 ValueGPR reg[33];?
  • @Dan: 如果reg 是一个类的成员(这似乎是从你的 cmets 判断的),那么将其更改为全局将是一个坏主意 - 你会得到不正确的如果您有多个该类的实例,则行为。相反,您应该找到一种方法来传递 reg 或包含它的对象,方法是引用 file2.cpp 中想要访问它的函数。
  • 你是对的,reg 是类的一部分。是否可以在包含 reg 的对象中定义全局指针?一个人如何去做这件事,然后在 file2.cpp 中访问它?
  • 请张贴课程声明。我越来越糊涂了。

标签: c++ header include public


【解决方案1】:

我会将 typedef 连同以下声明一起移动到 file1.h 中:

extern ValueGPR reg[];

ValueGPR reg[33]; 留在file1.cpp 中。

【讨论】:

    【解决方案2】:

    Cogwheel 的回答是正确的,但您的评论表明存在一些混淆的可能性,所以也许最好澄清一下:

    文件1.h:

    #ifndef FILE1_H_INCLUDED
    #define FILE1_H_INCLUDED
    
    typedef long ValueGPR;
    extern ValueGPR reg[];
    #define NUM_REGS 33
    
    #endif
    

    file1.c:

    #include "file1.h"
    
    ValueGPR reg[NUM_REGS];
    

    file2.c:

    #include "file1.h"
    
    /* ... */
    for (i=0; i<NUM_REGS; i++)
        show(reg[i]);
    

    编辑:鉴于reg 确实是一个类的成员这一点,上面的代码显然不起作用,尽管总体思路保持不变。对于班级成员,您需要将班级作为一个整体来处理,而不仅仅是reg 本身。试探一下可能的样子,你可能会有类似的东西:

    文件1.h:

    // include guard here
    
    class CPU_state { 
    public:
        typedef long ValueGPR;
        static const int num_regs = 33;
        ValueGPR reg[num_regs];
    
        //or, preferably:
    
        // std::vector<ValueGPR> regs;
        // CPU_state() : regs(num_regs) {}
        // ...
    };
    
    extern CPU_state cpu;
    

    file1.cpp:

    #include "file1.h"
    CPU_state cpu;
    

    file2.cpp:

    #include "file1.h"
    
    for (int i=0; i<cpu.num_regs; i++)
        show(cpu.reg[i]);
    

    如果您可能一次创建多个 CPU,那么您可能需要将指针或引用传递给 CPU_state(或您所称的任何名称),而不是像此代码使用的那样依赖全局实例。

    【讨论】:

    • 我已经尝试过这个错误。我认为这与 reg 包含在 file1.h 的一个类中这一事实有关,我忘了提及这个重要的细节......
    • 因此,file1.h 文件已经有一个“typedef CPU_state cpu”行,但是当我将“extern”附加到该行时,我被告知此声明中有多个存储类。有什么想法吗?
    • @Dan:你可能不希望它是 typedef,只是 extern CPU_state cpu;
    • 原来在 file2.cpp 中已经定义了一个对象,它允许我访问我所追求的 reg 变量。
    猜你喜欢
    • 2011-08-12
    • 2017-08-19
    • 1970-01-01
    • 2019-01-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多