当我试图处理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_hvar.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 ...,但它没有起作用。同样的错误。
发布于 2022-10-18 10:17:46
您似乎误解了头保护( #ifndef var_h和相关指令)的工作原理以及“外部”变量的声明是如何工作的。
头保护(上述或#pragma once指令)将防止从任何给定的单个翻译单元(TU)中多次包含/处理该文件,而不是来自不同的TU。因此,例如,如果一个源文件有多个#include "var.h"行-或者它还包含另一个本身有#include "var.h"行的头-那么这些保护将防止多个包含。但是,当您编译"var.cpp“和"main.cpp”(分别)时,每个上下文都会被重置。因此,这些编译中的每一个都将看到int variable;行,从而导致多个定义。
在您的示例中,您需要做的是在标头中指定variable是一个int,但在其他地方是定义的:extern int variable;。然后,在中,只有一个源文件(很可能是"var.cpp")提供了实际的定义,比如int variable; (最好有一个初始值:int variable = 0;)。
https://stackoverflow.com/questions/74109142
复制相似问题