Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/163.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/66.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 用子类定义类的数组_C++_C_Visual Studio 2010 - Fatal编程技术网

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参数宏。那么有什么解决方案吗?我是否也必须初始化不使用的成员?