當我嘗試在 VS Code/PlatformIO 中處理多個檔案時會出現此問題。
所以我建立了一個例子來說明這個問題:
聯結器(firmware.elf)說:'變數'的多重定義;'
變數.h:
#ifndef var_h
#define var_h
#pragma once
#include <Arduino.h>
int variable;
void set_var(int number);
#endif // var_h
變種cpp
#include "var.h"
void set_var(int number){
variable = number;
}
主檔案
#include <Arduino.h>
#include <SPI.h>
#include "var.h"
void setup() {
Serial.begin(115200);
}
void loop() {
Serial.print(variable);
delay(2000);
}
平臺io.ini
[env:esp32dev]
platform = espressif32
board = esp32dev
framework = arduino
我已經嘗試過使用其中之一#pragma once或#ifndef ...專門使用,但沒有奏效。同樣的錯誤。
uj5u.com熱心網友回復:
您似乎誤解了標頭保護(您的#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://www.uj5u.com/qukuanlian/517228.html
