当我尝试在 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;
}
main.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 中指定 variable
是 int
但已定义 其他地方:extern int 变量;
。然后,在只有一个源文件(最有可能是“var.cpp”)中提供实际的定义,其中包含诸如intvariable;
之类的行(最好具有初始值,不过:int 变量 = 0;
)。
关于c++ - VSCode/platformio 中的多个包含问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/74109142/