c++ - VSCode/platformio 中的多个包含问题

标签 c++ arduino esp32 platformio

当我尝试在 VS Code/PlatformIO 中处理多个文件时,会出现此问题。

所以我构建了一个示例来说明问题:

链接器 (firmware.elf) 表示:“‘变量’的多重定义;”

var.h:

#ifndef var_h
#define var_h

#pragma once
#include <Arduino.h>

int variable;

void set_var(int number);

#endif // var_h

var.cpp

#include "var.h"

void set_var(int number){
    variable = number;
}

ma​​in.cpp

#include <Arduino.h>
#include <SPI.h>
#include "var.h"

void setup() {
  Serial.begin(115200);
}

void loop() {
  Serial.print(variable);
  delay(2000);
}

platformio.ini

[env:esp32dev]
platform = espressif32
board = esp32dev
framework = arduino

我已经尝试过单独使用 #pragma Once#ifndef ...,但没有成功。同样的错误。

最佳答案

您似乎误解了 header 防护(您的 #ifndef var_h 和相关指令)的工作方式以及“外部”变量的声明的工作方式。

header 保护(上述或#pragma Once指令)将防止从任何给定的单个翻译单元(TU)多次包含/处理该文件但不是来自不同的 TU。因此,例如,如果一个源文件具有多个 #include "var.h" 行,或者如果它还包含另一个 header ,而该 header 本身具有 #include "var.h" code> 行 – 那么这些防护将防止多重包含。但是,当您(分别)编译“var.cpp”和“main.cpp”时,每个“上下文”都会重置。因此,每个编译都会看到 int variable; 行,从而导致多个定义。

就您而言,您需要做的是在 header 中指定 variableint已定义 其他地方:extern int 变量;。然后,在只有一个源文件(最有可能是“var.cpp”)中提供实际的定义,其中包含诸如intvariable;之类的行(最好具有初始值,不过:int 变量 = 0;)。

关于c++ - VSCode/platformio 中的多个包含问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/74109142/

相关文章:

c++ - Valgrind 和 "WARNING: new redirection conflicts with existing"

c++ - 从 C++ 调用 Cython 函数

c++ - 在函数中获取原始类型的指针

bluetooth - 当您无法访问官方 GATT XML 文件时,如何构建 BLE 应用程序?

c - 调用 i2s_read 函数时 ESP32 上出现 StoreProhibited 错误

c++ - 在同一循环中集成 pthread_create() 和 pthread_join()

c++ - 如何在 Linux 中查看 .o 文件的信息和编译器标志?

c++ - 将 int16_t 转换为 uint_8t*

JavaScript/网络开发 : Why do you need a server to connect to hardware?

c++ - 没有匹配函数来调用 'CFastLED::addLeds(CRGB [6], int)