我想在结构中声明一个 char数组并在声明它时初始化它。我在g ++和VS2010编译器上编译它。 g ++可以编译以下代码,但VS2010无法编译。 VS2010有错误。 从C ++入门开始, const static 类型数据在结构/类中声明时可以初始化。但是当我将它用于 OPName 数组时,两个编译器都报告错误。我只能在g ++上使用 const 来实现这一点。为什么会这样? 初始化数组变量的有效方法是什么,比如我的例子(即char数组),当它们在struct / class中声明时?
这是代码(.c文件):
typedef struct OPMap {
const char OPName[27][6] = {"SW", "LW", // 2
"J", "BEQ", "BNE", "BGEZ", "BGTZ", "BLEZ", "BLTZ", // 7
"ADDI", "ADDIU", // 2
"BREAK", // 1
"SLT", "SLTI", "SLTU", // 3
"SLL", "SRL", "SRA", // 3
"SUB", "SUBU", "ADD", "ADDU", // 4
"AND", "OR", "XOR", "NOR", // 4
"NOP"}; // 1
unsigned int op[8][8];
unsigned int op_TLB[4][8];
unsigned int op_R[8][8];
const unsigned int NOP = 0x00000000;
OPMap() {
//......
}
} Map;
答案 0 :(得分:0)
在C ++ 11之前,在类定义中为数据成员创建初始值设定项只有在成员为static const
且非结构非数组(例如int
或double
)。 VS2010不符合C ++ 11,因此您会收到该错误。
要使代码在C ++ 11之前工作,您应该更改为:
static const char OPName[27][6];
然后在你的一个.cpp文件(即不是头文件)中有:
static const char OPMap::OPName[27][6] = {"SW", "LW", // 2
"J", "BEQ", "BNE", "BGEZ", "BGTZ", "BLEZ", "BLTZ", // 7
"ADDI", "ADDIU", // 2
"BREAK", // 1
"SLT", "SLTI", "SLTU", // 3
"SLL", "SRL", "SRA", // 3
"SUB", "SUBU", "ADD", "ADDU", // 4
"AND", "OR", "XOR", "NOR", // 4
"NOP"}; // 1
在C ++ 11中,您可以通过添加static constexpr
。
答案 1 :(得分:0)
这里有多点,第一点是C ++ 98和C ++ 11之间的规则非常不同。 C ++ 11允许大多数类内初始化。
假设我们在谈论C ++ 98:
当您在班级中编写static const int x = 3;
时,编译器“有时”接受它,即它可以简单地删除对MyClass::x
的所有引用并替换该值,就像#defines
一样。但是,如果您尝试使用x
以外的任何方式而不是const表达式,您将收到错误。例如,如果您有一行说明:
const int *px = &MyClass::x;
它不起作用,因为现在编译器需要在内存中为x分配一个位置,而不是像以前那样替换该值。现在你必须在cpp文件中定义它,即
const int MyClass::x = 3;
当然,这只适用于整体类型。
因此在C ++ 98中,初始化类成员是在构造函数中完成的,例如变量,并通过在cpp文件中为静态成员定义它们。课堂上的static const int x = 3;
只是一种“有时”工作的捷径。