如何在Intel C++编译器中启用标准C++14/17并解决头文件报错?
Hey,我来帮你搞定这个问题!我之前在类似环境下也碰到过Intel C编译器对C17新特性支持的坑,结合你的VS2017 + ICC 2018 Update1的配置,给你几个可行的解决办法:
解决Intel C++ 2018 Update1无法识别std::variant/std::optional的问题
1. 先搞清楚:ICC 18.0对C++17的支持有局限性
Intel C++ Compiler 18.0(也就是你用的2018 Update1)对C++17的支持是部分支持的,std::variant和std::optional刚好不在它当时实现的特性列表里。哪怕你加了-std=c++17或/Qstd=c++17编译选项,编译器本身没实现这些模板类,自然会报头文件相关的错误。
2. 强制让ICC使用MSVC的标准库
默认情况下,ICC可能会调用自己的标准库,而VS2017的MSVC标准库(版本14.13)已经完整支持std::variant和std::optional了。你可以这么设置:
- 打开VS项目属性,找到Intel C++ Compiler > Advanced选项卡
- 把Use Microsoft STL这一项改成
Yes - 同时别忘了在Configuration Properties > C/C++ > Language里,把C++ Language Standard设置为
ISO C++17 Standard (/std:c++17)(这是VS本身的标准设置,比ICC的选项更直接)
设置完之后重新编译,应该就能正常包含<variant>和<optional>头文件了。
3. 升级Intel Parallel Studio到更高版本
如果你的项目允许升级工具链,最彻底的办法是把Intel Parallel Studio Xe升级到2019或更新的版本。后续版本的ICC已经完整支持C17的这些特性,不会再出现这类头文件找不到的问题。毕竟2018 Update1是2017年底的版本,对C17的支持确实滞后了一些。
4. 临时替代方案(没法升级时用)
如果暂时没法升级编译器,你可以用第三方库来替代标准库的实现:
- 比如Boost库的
boost::variant和boost::optional,它们的用法和标准库版本几乎完全一致,兼容性拉满 - 或者用轻量级的单头文件实现,比如
tl::optional(来自tl::expected库),这类实现不需要复杂的编译链接,直接包含头文件就能用
内容的提问来源于stack exchange,提问作者Buddhika Chaturanga
相关产品推荐
相关产品推荐

