gcc g++编译器在-std=c++11标志时出错,但在-std=gnu++11标志下编译正常,这是什么意思?

4ngedf3f  于 2023-06-23  发布在  其他
关注(0)|答案(1)|浏览(218)

我正在维护一个旧的服务器,它运行在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扩展或其他什么?

hk8txs48

hk8txs481#

使用-std=c11而不是-std=gnu11时可能会遇到错误的原因是,您的代码可能使用了严格C11模式不支持的某些GNU扩展。通过启用-std=gnu11标志,您允许编译器使用这些扩展并避免相关错误。
值得注意的是,使用GNU扩展会降低代码的可移植性,因为其他编译器可能不支持这些扩展。如果你希望你的代码严格遵守C11标准,通常建议使用-std=c11标志。但是,如果您依赖于某些GNU扩展或专门针对GCC编译器,则使用-std=gnu++11可能是合适的。

相关问题