VS编译器和g ++之间在结构中变量初始化方面的区别

时间:2014-09-08 03:28:16

标签: c

我想在结构中声明一个 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;

2 个答案:

答案 0 :(得分:0)

在C ++ 11之前,在类定义中为数据成员创建初始值设定项只有在成员为static const且非结构非数组(例如intdouble)。 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;只是一种“有时”工作的捷径。

结帐Defining static members in C++