我希望在一个结构中声明一个char数组,并在声明它时初始化它。我在g++和VS2010编译器上编译了它。g++可以编译以下代码,但VS2010无法编译。VS2010有错误。从C++引物中,可以在结构/类中声明静态类型数据时对其进行初始化。但是,当我将它用于OPName数组时,两个编译器都会报告错误。我只能在g++上使用const来实现这一点。为什么会发生这种事?当数组在struct/class中声明时,初始化数组变量的有效方法是什么,比如我的示例(例如char数组)?
下面是代码(.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;发布于 2014-09-08 04:20:16
在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在类定义中使用此表。
发布于 2014-09-08 04:26:52
这里有多个要点,第一点是C++98和C++11之间的规则非常不同,C++11允许大多数类内初始化。
假设我们讨论的是C++98:当您在类中编写static const int x = 3;时,编译器“有时”接受它,也就是说,它可以简单地删除对MyClass::x的所有引用并替换值,就像#defines一样。但是,如果尝试在const表达式以外的任何情况下使用x,则会出现错误。例如,如果有一行声明:
const int *px = &MyClass::x;它不能工作,因为现在编译器需要在内存中为x指定一个位置,而不是像以前那样只替换值。现在您必须在cpp文件中定义它,即
const int MyClass::x = 3;当然,这只适用于积分类型。因此,在C++98中,初始化类成员是在构造函数(例如变量)中完成的,并通过在cpp文件中为静态成员定义类成员来完成。类内static const int x = 3;只是一条“有时”工作的捷径。
https://stackoverflow.com/questions/25717075
复制相似问题