C++ 用子类定义类的数组
无法准确地为这个问题想出正确的标题,但是当我为我的程序设置常量数据时,这个问题似乎总是发生。我的程序基本上是一个轻量级的汇编程序,作为我的自定义代码编译器的一小部分 卡森伯勒C++ 用子类定义类的数组,c++,c,visual-studio-2010,C++,C,Visual Studio 2010,无法准确地为这个问题想出正确的标题,但是当我为我的程序设置常量数据时,这个问题似乎总是发生。我的程序基本上是一个轻量级的汇编程序,作为我的自定义代码编译器的一小部分 卡森伯勒 struct sOperand { bool used; eOperandType type; int size; }; struct sOpcodeDefinition { bool used; BYTE opcode; BYTE extended_opcode;
struct sOperand
{
bool used;
eOperandType type;
int size;
};
struct sOpcodeDefinition
{
bool used;
BYTE opcode;
BYTE extended_opcode;
sOperand operands[5];
};
struct sInstructionDefinition
{
eMnemonicInstruction instruction;
sOpcodeDefinition opcodes[16];
};
卡塞姆布勒
#define MNEMONIC(a,b) {a,b}
#define OPCODE(a,b,c) {true,OPCODE_##a,b,c}
#define OPERAND(a,b) {true,(eOperandType)OPERAND_##a,b}
sInstructionDefinition OpcodeDefinitionTable[NUM_X86_OPCODES] = {
MNEMONIC(INC,
OPCODE(INC_AX, 0, OPERAND(REGISTER_AX, 4)),
OPCODE(INC_CX, 0, OPERAND(REGISTER_CX, 4)),
OPCODE(INC_DX, 0, OPERAND(REGISTER_DX, 4)),
OPCODE(INC_BX, 0, OPERAND(REGISTER_BX, 4)),
OPCODE(INC_SP, 0, OPERAND(REGISTER_SP, 4)),
OPCODE(INC_BP, 0, OPERAND(REGISTER_BP, 4)),
OPCODE(INC_SI, 0, OPERAND(REGISTER_SI, 4)),
OPCODE(INC_DI, 0, OPERAND(REGISTER_DI, 4))
),
MNEMONIC(DEC,
OPCODE(DEC_AX, 0, OPERAND(REGISTER_AX, 4)),
OPCODE(DEC_CX, 0, OPERAND(REGISTER_CX, 4)),
OPCODE(DEC_DX, 0, OPERAND(REGISTER_DX, 4)),
OPCODE(DEC_BX, 0, OPERAND(REGISTER_BX, 4)),
OPCODE(DEC_SP, 0, OPERAND(REGISTER_SP, 4)),
OPCODE(DEC_BP, 0, OPERAND(REGISTER_BP, 4)),
OPCODE(DEC_SI, 0, OPERAND(REGISTER_SI, 4)),
OPCODE(DEC_DI, 0, OPERAND(REGISTER_DI, 4))
),
MNEMONIC(PUSH,
OPCODE(PUSH_AX, 0, OPERAND(REGISTER_AX, 4)),
OPCODE(PUSH_CX, 0, OPERAND(REGISTER_CX, 4)),
OPCODE(PUSH_DX, 0, OPERAND(REGISTER_DX, 4)),
OPCODE(PUSH_BX, 0, OPERAND(REGISTER_BX, 4)),
OPCODE(PUSH_SP, 0, OPERAND(REGISTER_SP, 4)),
OPCODE(PUSH_BP, 0, OPERAND(REGISTER_BP, 4)),
OPCODE(PUSH_SI, 0, OPERAND(REGISTER_SI, 4)),
OPCODE(PUSH_DI, 0, OPERAND(REGISTER_DI, 4))
),
MNEMONIC(POP,
OPCODE(POP_AX, 0, OPERAND(REGISTER_AX, 4)),
OPCODE(POP_CX, 0, OPERAND(REGISTER_CX, 4)),
OPCODE(POP_DX, 0, OPERAND(REGISTER_DX, 4)),
OPCODE(POP_BX, 0, OPERAND(REGISTER_BX, 4)),
OPCODE(POP_SP, 0, OPERAND(REGISTER_SP, 4)),
OPCODE(POP_BP, 0, OPERAND(REGISTER_BP, 4)),
OPCODE(POP_SI, 0, OPERAND(REGISTER_SI, 4)),
OPCODE(POP_DI, 0, OPERAND(REGISTER_DI, 4))
),
};
显然,我的目标是创建一个SInstructDefinition数组并填充其对象数组成员,等等
不幸的是,编译后的代码中缺少每个sInstructionDefinition的第二个sOpcodeDefinition。我想Soperan和成员也可能开始出现同样的情况。你知道初始化这个大型嵌套结构的正确方法是什么吗?你的
助记符宏有2个参数,但你提供了9个参数。你可能打算写:
MNEMONIC(INC,
{
OPCODE(INC_AX, 0, {OPERAND(REGISTER_AX, 4)}),
OPCODE(INC_CX, 0, {OPERAND(REGISTER_CX, 4)}),
// etc..
}
) // etc
请注意,操作码宏中的大括号用于初始化结构,而上面代码中的额外大括号用于初始化数组
编辑:请注意,上面的代码仍然不起作用,因为预处理器仍然会将逗号视为参数分隔符。使用可变宏找到了一个很好的解决方案。。。奇怪的是,在{}中手动包装操作码用法并没有起作用。但是现在,第2、3、4等sOpcodeDefinition定义已正确编译
#define MNEMONIC(a,...) {a,{__VA_ARGS__}}
#define OPCODE(a,b,...) {true,OPCODE_##a,b,{__VA_ARGS__}}
#define OPERAND(a,b) {true,(eOperandType)OPERAND_##a,b}
#define NULL_OPERAND {false,BAD_OPERAND,0}
sInstructionDefinition OpcodeDefinitionTable[NUM_MNEMONICS] = {
MNEMONIC(INC,
OPCODE(INC_AX, 0, OPERAND(REGISTER_AX, 4)),
OPCODE(INC_CX, 0, OPERAND(REGISTER_CX, 4)),
OPCODE(INC_DX, 0, OPERAND(REGISTER_DX, 4)),
OPCODE(INC_BX, 0, OPERAND(REGISTER_BX, 4)),
OPCODE(INC_SP, 0, OPERAND(REGISTER_SP, 4)),
OPCODE(INC_BP, 0, OPERAND(REGISTER_BP, 4)),
OPCODE(INC_SI, 0, OPERAND(REGISTER_SI, 4)),
OPCODE(INC_DI, 0, OPERAND(REGISTER_DI, 4))
),
MNEMONIC(DEC,
OPCODE(DEC_AX, 0, OPERAND(REGISTER_AX, 4)),
OPCODE(DEC_CX, 0, OPERAND(REGISTER_CX, 4)),
OPCODE(DEC_DX, 0, OPERAND(REGISTER_DX, 4)),
OPCODE(DEC_BX, 0, OPERAND(REGISTER_BX, 4)),
OPCODE(DEC_SP, 0, OPERAND(REGISTER_SP, 4)),
OPCODE(DEC_BP, 0, OPERAND(REGISTER_BP, 4)),
OPCODE(DEC_SI, 0, OPERAND(REGISTER_SI, 4)),
OPCODE(DEC_DI, 0, OPERAND(REGISTER_DI, 4))
),
MNEMONIC(PUSH,
OPCODE(PUSH_AX, 0, OPERAND(REGISTER_AX, 4)),
OPCODE(PUSH_CX, 0, OPERAND(REGISTER_CX, 4)),
OPCODE(PUSH_DX, 0, OPERAND(REGISTER_DX, 4)),
OPCODE(PUSH_BX, 0, OPERAND(REGISTER_BX, 4)),
OPCODE(PUSH_SP, 0, OPERAND(REGISTER_SP, 4)),
OPCODE(PUSH_BP, 0, OPERAND(REGISTER_BP, 4)),
OPCODE(PUSH_SI, 0, OPERAND(REGISTER_SI, 4)),
OPCODE(PUSH_DI, 0, OPERAND(REGISTER_DI, 4))
),
MNEMONIC(POP,
OPCODE(POP_AX, 0, OPERAND(REGISTER_AX, 4)),
OPCODE(POP_CX, 0, OPERAND(REGISTER_CX, 4)),
OPCODE(POP_DX, 0, OPERAND(REGISTER_DX, 4)),
OPCODE(POP_BX, 0, OPERAND(REGISTER_BX, 4)),
OPCODE(POP_SP, 0, OPERAND(REGISTER_SP, 4)),
OPCODE(POP_BP, 0, OPERAND(REGISTER_BP, 4)),
OPCODE(POP_SI, 0, OPERAND(REGISTER_SI, 4)),
OPCODE(POP_DI, 0, OPERAND(REGISTER_DI, 4))
),
};
哦,当然。一些被忽略的关于宏的东西。{}应该在助记符的第二个参数附近。非常感谢,将在几分钟内进行测试…好吧,这看起来是正确的,但我现在收到了实际错误/警告:警告1警告C4002:宏“助记符”的实际参数太多。
错误C2078:初始值设定项太多
是的,预处理器将逗号视为参数分隔符。它对{
没有什么特别的意义。我应该看到这一点。这意味着1)必须使用可变宏,2)使用boost.preprocessor列表,或3)如果总是有8个操作码创建9参数宏。那么有什么解决方案吗?我是否也必须初始化不使用的成员?