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

Geo*_*tis 3 c++ g++

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

g++  -std=c++11 -m32 -O0  main000.cpp ; ./a.out
Run Code Online (Sandbox Code Playgroud)

并正常执行

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

g++  -std=c++11 -m32 -O1  main000.cpp ; ./a.out
Run Code Online (Sandbox Code Playgroud)

不起作用并生成堆栈转储

谁知道为什么?

#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;
}
Run Code Online (Sandbox Code Playgroud)

Meh*_*dad 5

对于这两个-O1-O2,这对我运行良好

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

所以这可能是你的设置有问题.我建议在里面运行它gdb并得到一个backtrace.

并确保您没有链接库与定义的冲突标识符.