Vscode/ESP-IDF 错误命名空间“std”没有成员“array”无论如何都会编译

Posted

技术标签:

【中文标题】Vscode/ESP-IDF 错误命名空间“std”没有成员“array”无论如何都会编译【英文标题】:Vscode/ESP-IDF Errors namespace "std" has no member "array" will compile anyways 【发布时间】:2021-08-01 22:02:07 【问题描述】:

我刚刚安装了最新版本的 VScode,加上 Arduino 扩展和最新的 ESP-IDF,我正在尝试编写一个 adafruit esp32 羽毛。

当使用我在 Arduino IDE 版本 1.8.15 中编写的代码时,并且还在测试版 Arduino-DE 2.0.9 中进行了测试,我没有出现任何错误。

一个初始样本是:

#include <array>
//#include <utility/imumaths.h>
//#include <driver/adc.h>
#include <MPU9250.h>
#include <Madgwick.h>
#include <TaskScheduler.h>
#include <Adafruit_Sensor.h>
#include <Adafruit_BNO055.h>
#include <utility/imumaths.h>
#include <driver/adc.h>
//#define betaDef = 10f;
Adafruit_BNO055 bno = Adafruit_BNO055(-1, 0x28);
std::array<std::array<float, 3> , 2> vals = 0;
void taskPrint();

//Tasks
Task t1(1, TASK_FOREVER, &taskPrint);

Scheduler runner;

void taskPrint() 
  Serial.print(vals[0][0]);
  Serial.print(',');
  Serial.print(vals[0][1]);
  Serial.print(',');
  Serial.print(vals[0][2]);
  Serial.print(',');
  Serial.print(vals[1][0]);
  Serial.print(',');
  Serial.print(vals[1][1]);
  Serial.print(',');
  Serial.println(vals[1][2]);
;

第 13 行的第一个错误 (namespace "std" has no member "array")。

在 VScode 中使用相同的代码时,Vscode 会验证、抱怨,但无论如何都会编译和上传(代码在 esp32 上继续正常工作)。带有不断的曲线标记和错误。

我检查了 c_cpp_properties,发现 esp-idf 正在使用 c++11 版本。

"version": 4,
    "configurations": [
        
            "name": "Arduino",
            "compilerPath": "C:\\Users\\computer\\AppData\\Local\\Arduino15\\packages\\esp32\\tools\\xtensa-esp32-elf-gcc\\1.22.0-97-gc752ad5-5.2.0\\bin\\xtensa-esp32-elf-g++",
            "compilerArgs": [
                "-std=gnu++11",
                "-Wpointer-arith",
                "-fexceptions",
                "-fstack-protector",
                "-ffunction-sections",
                "-fdata-sections",
                "-fstrict-volatile-bitfields",
                "-mlongcalls",
                "-nostdlib",
                "-w",
                "-Wno-error=maybe-uninitialized",
                "-Wno-error=unused-function",
                "-Wno-error=unused-but-set-variable",
                "-Wno-error=unused-variable",
                "-Wno-error=deprecated-declarations",
                "-Wno-unused-parameter",
                "-Wno-unused-but-set-parameter",
                "-Wno-missing-field-initializers",
                "-Wno-sign-compare",
                "-fno-rtti"
            ],
            "intelliSenseMode": "gcc-x64",
            "includePath": [
            //a whole tonne of paths
]
"forcedInclude":["C:\\Users\\computer\\AppData\\Local\\Arduino15\\packages\\esp32\\hardware\\esp32\\1.0.6\\cores\\esp32\\Arduino.h"
],
"cStandard": "c11",
"cppStandard": "c++11",
"defines": [ tonnes of defines 

            ]
        
    ]

检查 std::array 的 cpp ref 这应该在 cp++11 中得到支持

修改这个文件只会导致 Vscode 用原始设置覆盖它,因为这个错误,我只能假设我得到的其他错误是相关的(所有似乎都有我的数组有各种问题。

namespace "std" has no member "array"C/C++(135)
identifier "vals" is undefinedC/C++(20)
qualified name is not allowedC/C++(283)
explicit type is missing ('int' assumed)C/C++(260)
mag_offsets" is not a nonstatic data member or base class of class "euler"C/C++(292)

虽然我在编码方面很糟糕,但我很确定这个问题与程序或编译器设置有关,而不是我的能力不足。

如何解决这个命名空间问题?我想使用 Vscode 对我的嵌入式项目进行编程……但目前,除了来自 Intellisense 的看似虚假的报告外,我什么也没得到。

【问题讨论】:

【参考方案1】:

如果没有所有文件,重现您的错误有点困难,但我建议使用 xtensa-esp32-elf-gcc 而不是 xtensa-esp32-elf-g++ 在 compilerPath 中,因为 Microsoft C/C++ 扩展似乎可以与 gcc 一起使用。

另一个问题可能是 includePaths 或定义中的冲突引用。如果第一种方法不起作用,我建议删除它们。

【讨论】:

以上是关于Vscode/ESP-IDF 错误命名空间“std”没有成员“array”无论如何都会编译的主要内容,如果未能解决你的问题,请参考以下文章

错误:命名空间“std”中没有名为“enable_if_t”的模板;你是说'enable_if'吗?

命名空间“std”中没有名为“shared_ptr”的类型

命名空间“std”中没有名为“size”的成员

Vscode esp-idf配置文件

VSCode ESP-IDF项目搭建

c++中命名空间std的函数都有哪些