是g ++ buggy?和clang ++呢?带有-O0和-O1选项的g ++编译代码表现不同,对于具有-O0和-O2的clang ++也是如此

时间:2014-01-25 21:09:07

标签: c++ g++

命名为文件“main000.cpp”的代码在Linux机器上使用后续命令行编译和执行:

g++  -std=c++11 -m32 -O0  main000.cpp ; ./a.out

并正常执行

如果编译并执行将O0更改为O1

g++  -std=c++11 -m32 -O1  main000.cpp ; ./a.out

不起作用并生成堆栈转储

任何知道原因的机构?

#include <stdio.h>
#include <string>

using namespace std;
typedef unsigned int Token;

const Token tokenBase=0x80000000;

enum        classId{
    classNoId=tokenBase,
    classPrimitiveId,
};

struct classInfo{classId id;wstring name;};

classInfo classInfos[]={ 
    {classNoId,L"classNoID"},
    {classPrimitiveId,L"classPrimitiveId"},
};

int main(){
    int id=classInfos[0].id;
    return 0*id;
}

1 个答案:

答案 0 :(得分:5)

对于-O1-O2,这对我来说运行正常

  • Clang 3.2和GCC 4.8.1(Windows)
  • Clang 3.3和GCC 4.7.3(Linux)

因此,您的设置可能存在问题。我建议在gdb内运行并获得backtrace

并确保您没有使用已定义的冲突标识符链接库。