Linux下VS(1.31.1)用g++编译C++时std::cyl_bessel_j报错咨询
解决
std::cyl_bessel_j不是std成员的编译错误 我来帮你搞定这个头疼的编译问题!其实核心原因是VS Code的代码提示和实际编译时的C++标准不匹配,再加上g++的标准库特性支持规则导致的:
- VS Code的IntelliSense(就是给你代码提示的功能)可能默认开启了C++17及以上标准,所以能识别
std::cyl_bessel_j; - 但g++ 8.2.0默认使用的是C14标准,而
cyl_bessel_j这类贝塞尔函数是**C17才正式被纳入std命名空间**的,所以编译时就会报错说找不到这个成员。
具体解决办法
1. 编译时指定C++17标准
最直接的办法就是编译时加上-std=c++17参数。如果是在终端编译,命令改成:
g++ -std=c++17 你的文件名.cpp -o 生成的程序名
如果用VS Code的ctrl+alt+N快捷键运行,得修改编译任务配置:打开.vscode/tasks.json,在args数组里添加"-std=c++17",示例片段如下:
{ "version": "2.0.0", "tasks": [ { "label": "g++ build active file", "type": "shell", "command": "/usr/bin/g++", "args": [ "-std=c++17", // 新增这一行 "-g", "${file}", "-o", "${fileDirname}/${fileBasenameNoExtension}" ], // 其他配置保持不变 } ] }
2. 同步编辑器的IntelliSense标准
为了避免再出现“编辑器认但编译不认”的情况,让提示和编译行为一致,可以在项目根目录的.vscode文件夹下创建c_cpp_properties.json,设置成C++17标准:
{ "configurations": [ { "name": "Linux", "includePath": ["${workspaceFolder}/**"], "defines": [], "compilerPath": "/usr/bin/g++", "cppStandard": "c++17", "intelliSenseMode": "gcc-x64" } ], "version": 4 }
3. 应急备选方案(不推荐)
如果因为某些限制没法启用C17,也可以试试去掉std::前缀直接调用函数——C17之前,g++把这些贝塞尔函数放在了全局命名空间里:
#include <cmath> #include <iostream> int main() { double x = 1.2345; // 去掉std::前缀,直接调用 std::cout << "j_1(" << x << ") = " << cyl_bessel_j(1, x) << '\n'; std::cout << "(sin x)/x^2 - (cos x)/x = " << std::sin(x)/(x*x) - std::cos(x)/x << '\n'; }
不过还是更推荐用C17的方式,符合现代C的规范。
验证效果
修改完配置或代码后,再按ctrl+alt+N运行,应该就能正常输出贝塞尔函数的计算结果啦!
内容的提问来源于stack exchange,提问作者Pierre Blanche
相关产品推荐
相关产品推荐

