全局使用公共变量

时间:2010-07-06 15:44:07

标签: c++ header include public

我正在尝试修改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变量的内容?

这两个文件实际上都是这样的(在考虑了这个之后): “File1.h”

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

“File2.cpp”

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

2 个答案:

答案 0 :(得分:4)

我会将typedef移动到file1.h以及以下声明:

extern ValueGPR reg[];

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

答案 1 :(得分:1)

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

file1.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本身。对可能的内容进行狂野的抨击,你可以拥有类似的东西:

file1.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(或任何您称之为的CPU),而不是依赖于此代码使用的全局实例。 / p>