我正在尝试修改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
...
}
...
答案 0 :(得分:4)
我会将typedef移动到file1.h以及以下声明:
extern ValueGPR reg[];
将ValueGPR reg[33];
保留在file1.cpp。
答案 1 :(得分:1)
Cogwheel的回答是正确的,但你的评论表明存在混淆的可能性,所以或许最好澄清一下:
#ifndef FILE1_H_INCLUDED
#define FILE1_H_INCLUDED
typedef long ValueGPR;
extern ValueGPR reg[];
#define NUM_REGS 33
#endif
#include "file1.h"
ValueGPR reg[NUM_REGS];
#include "file1.h"
/* ... */
for (i=0; i<NUM_REGS; i++)
show(reg[i]);
编辑:鉴于reg
实际上是一个类的成员的附加点,上面的代码显然不起作用,尽管一般的想法保持不变。对于一个类成员,你需要处理整个类,而不仅仅是reg
本身。对可能的内容进行狂野的抨击,你可以拥有类似的东西:
// 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;
#include "file1.h"
CPU_state cpu;
#include "file1.h"
for (int i=0; i<cpu.num_regs; i++)
show(cpu.reg[i]);
如果您可能一次创建多个CPU,那么您可能需要将指针或引用传递给CPU_state(或任何您称之为的CPU),而不是依赖于此代码使用的全局实例。 / p>