g++编译器给我错误的-std=c++11标志,但它编译良好的-std=gnu++11.这是什么意思?



我在工作中维护一个旧服务器,它运行在CentOS6(gcc (GCC) 4.4.7, C++98)上我试图用c++ 11把它迁移到CentOS7(gcc (GCC) 4.8.5)

一开始,我试着编译一个标志,-std=c++11,但它给了我很多错误,如下所示。

`In file included from /usr/lib/gcc/x86_64-redhat-linux/4.8.5/include/x86intrin.h:30:0,
from /usr/include/c++/4.8.2/x86_64-redhat-linux/bits/opt_random.h:33,
...
/usr/lib/gcc/x86_64-redhat-linux/4.8.5/include/mmintrin.h: In function ‘__m64_mm_cvtsi32_si64(int)’:
/usr/lib/gcc/x86_64-redhat-linux/4.8.5/include/mmintrin.h:61:54: error: can’t convert between vector values of different size
return (__m64) __builtin_ia32_vec_init_v2si (__i, 0);
^
/usr/lib/gcc/x86_64-redhat-linux/4.8.5/include/mmintrin.h: In function ‘int _mm_cvtsi64_si32(__m64)’:
/usr/lib/gcc/x86_64-redhat-linux/4.8.5/include/mmintrin.h:104:53: error: cannot convert ‘__m64 {aka int}’ to ‘__vector(2) int’ for argument ‘1’ to ‘int __builtin_ia32_vec_ext_v2si(__vector(2) int, int)’
return __builtin_ia32_vec_ext_v2si ((__v2si)__i, 0);`

不知何故,我遇到了使用标志,-std=gnu++11,它工作得很好。

我可以假设什么?这是否意味着旧的服务器代码在某种程度上使用了gnu扩展或其他什么?

使用-std=c++11而不使用-std=gnu++11可能会遇到错误的原因是,您的代码可能使用了严格的c++11模式不支持的某些gnu扩展。通过启用-std=gnu++11标志,您允许编译器使用这些扩展并避免相关错误。

值得注意的是,使用GNU扩展会降低代码的可移植性,因为它们可能不被其他编译器支持。如果您希望代码严格遵守c++11标准,通常建议使用-std=c++11标志。但是,如果您依赖于某些GNU扩展或专门针对GCC编译器,那么使用-std= GNU ++11可能是合适的。

相关内容

最新更新