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

标签 c

我想在结构中声明一个char数组,并在声明时对其进行初始化。我在 g++ 和 VS2010 编译器上编译它。 g++ 可以编译以下代码,但 VS2010 不能。 VS2010有错误。 从 C++ 入门来看,const static 类型数据可以在结构/类中声明时进行初始化。但是当我将它用于 OPName 数组时,两个编译器都会报告错误。我只能在 g++ 上使用 const 来实现这一点。为什么会发生这种情况? 当在结构/类中声明数组变量时,初始化数组变量(如我的示例(即 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;

最佳答案

在 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 来在类定义中包含此表。

关于c - VS 编译器和 g++ 在结构体变量初始化方面的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25717075/

相关文章:

c - GTK+2 : My App is Crashing on quit

ios - Objective-C 中计算 float 的奇怪值

c - 从 TCP 套接字读取错误数据

c - goto 的可接受用途是什么?

c - 为什么我在这个程序中出现段错误?

无法弄清楚我的代码有什么问题:\(Array subtraction in C)

c - 从 C 中的输入重定向读取整数

c - 在 C 中从多维数组释放内存时出现问题,free() 导致程序崩溃

C程序反向链表

c - 我什么时候需要在 C 中进行类型转换?