首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >VSCode / platformio中多个包含的问题

VSCode / platformio中多个包含的问题
EN

Stack Overflow用户
提问于 2022-10-18 10:02:03
回答 1查看 44关注 0票数 2

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

所以我建立了一个例子来说明这个问题:

链接器(firmware.elf)说:“变量的多个定义;”

var.h:

代码语言:javascript
复制
#ifndef var_h
#define var_h

#pragma once
#include <Arduino.h>

int variable;

void set_var(int number);

#endif // var_h

var.cpp

代码语言:javascript
复制
#include "var.h"

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

main.cpp

代码语言:javascript
复制
#include <Arduino.h>
#include <SPI.h>
#include "var.h"

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

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

platformio.ini

代码语言:javascript
复制
[env:esp32dev]
platform = espressif32
board = esp32dev
framework = arduino

我已经尝试过专门使用#pragma once#ifndef ...,但它没有起作用。同样的错误。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 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;)。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/74109142

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档