首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >VS编译器和g++在结构中变量初始化方面的区别

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

Stack Overflow用户
提问于 2014-09-08 03:28:15
回答 2查看 131关注 0票数 0

我希望在一个结构中声明一个char数组,并在声明它时初始化它。我在g++和VS2010编译器上编译了它。g++可以编译以下代码,但VS2010无法编译。VS2010有错误。从C++引物中,可以在结构/类中声明静态类型数据时对其进行初始化。但是,当我将它用于OPName数组时,两个编译器都会报告错误。我只能在g++上使用const来实现这一点。为什么会发生这种事?当数组在struct/class中声明时,初始化数组变量的有效方法是什么,比如我的示例(例如char数组)?

下面是代码(.c文件):

代码语言:javascript
复制
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;
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-09-08 04:20:16

在C++11之前,只有当成员是static const和非结构化、非数组(例如intdouble)时,类定义中的数据成员的初始化程序才是合法的。VS2010不符合C++11,因此您将得到该错误。

要使代码在C++11之前工作,您应该更改为:

代码语言:javascript
复制
static const char OPName[27][6];

然后在其中一个.cpp文件(即不是头文件)中有:

代码语言:javascript
复制
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在类定义中使用此表。

票数 0
EN

Stack Overflow用户

发布于 2014-09-08 04:26:52

这里有多个要点,第一点是C++98和C++11之间的规则非常不同,C++11允许大多数类内初始化。

假设我们讨论的是C++98:当您在类中编写static const int x = 3;时,编译器“有时”接受它,也就是说,它可以简单地删除对MyClass::x的所有引用并替换值,就像#defines一样。但是,如果尝试在const表达式以外的任何情况下使用x,则会出现错误。例如,如果有一行声明:

代码语言:javascript
复制
const int *px = &MyClass::x;

它不能工作,因为现在编译器需要在内存中为x指定一个位置,而不是像以前那样只替换值。现在您必须在cpp文件中定义它,即

代码语言:javascript
复制
const int MyClass::x = 3;

当然,这只适用于积分类型。因此,在C++98中,初始化类成员是在构造函数(例如变量)中完成的,并通过在cpp文件中为静态成员定义类成员来完成。类内static const int x = 3;只是一条“有时”工作的捷径。

查看Defining static members in C++

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25717075

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档