g++使用-std=c++11编译报错但-std=gnu++11正常是什么原因
报错原因与问题解答
1. -std=c++11与-std=gnu++11的核心差异
-std=c++11为严格C11标准兼容模式,会关闭所有GNU专属的语言扩展特性,同时定义__STRICT_ANSI__宏触发系统头文件的严格标准兼容逻辑;-std=gnu++11在C11标准基础上保留了GNU扩展支持,是GCC的默认行为模式。
2. 本次报错的直接原因
本次报错并非业务代码直接导致,根因是CentOS7自带的GCC 4.8.5配套头文件依赖GNU扩展:mmintrin.h等SIMD指令相关头文件、以及C++标准库的opt_random.h本身依赖GNU扩展定义的向量类型(如__m64、__v2si)、内置函数的隐式转换规则,严格标准模式下这些特性被限制,就会触发类型不兼容的报错。
3. 是否使用GNU扩展的判断方法
- 首先排除系统头文件干扰:可通过极简测试代码验证:
执行#include <iostream> int main() { std::cout << "test" << std::endl; return 0; }g++ -std=c++11 test.cpp编译,如果仍报同类mmintrin.h相关错误,说明完全是系统头文件的问题,和业务代码无关。 - 如果极简测试代码可正常编译,仅业务代码编译报错,才说明业务代码中用到了GNU扩展特性,比如零长度数组、语句表达式、嵌套函数等旧版GCC允许的非标准语法。
- 额外说明:CentOS6上的GCC 4.4.7默认编译模式为
-std=gnu++98,默认开启GNU扩展,就算旧代码用到了扩展特性,在原环境下也不会触发报错。
内容的提问来源于stack exchange,提问作者Jon Phil
相关产品推荐
相关产品推荐

