如何创建用于多个源文件的全局变量/包含/函数

How to create global variables/includes/functions for use in multiple source files

本文关键字:源文件 全局变量 包含 函数 何创建 创建 用于      更新时间:2023-10-16

我正在为一个ESP8266开发一个程序,将所有内容都放在一个源文件中有点混乱,所以我决定分解它,但我不确定如何正确构建不同的文件。

我当前的结构是一个包含我的void loop()void setup()main.cpp文件,没有包含。然后,我有一个名为effects.cpp的单独文件,其中包含不同的 LED 效果功能,以及相应的effects.h文件。再次没有包含。最后,我有一个包含以下内容的globals.h文件:

#ifndef GLOBAL_H
#define GLOBAL_H
#include <ESP8266WiFi.h>
#include <DNSServer.h>
#include <WiFiManager.h>
#include <FastLED.h>
#include <BlynkSimpleEsp8266.h> //library for blynk functions
#define NUM_LEDS 150 //Number of LEDs on the strip
#define DATA_PIN D5
#define CLOCK_PIN D6
#define LED_TYPE APA102 //Change this to the chipset of the LED strip you're using
#define BRIGHTNESS 84
extern char auth[]; //stores API token for Blynk
extern int pinValue; //stores state of button from Blynk app
CRGB leds[NUM_LEDS];
#endif

因此,我为main.cppeffects.cpp都添加了#include <globals.h>。我的理解是,使用这种结构,这两个文件都可以引用相同的库和相同的变量,如globals.h中所述。这似乎在大多数情况下都有效,但我不断收到错误,说"Blynk"有多个定义(第一次出现在effects.cpp,第二次出现在main.cpp)。我得到同样的错误"led"。

我没有在我的代码中的任何地方定义"Blynk",它是一个外部库,所以我不确定问题是什么。如果代码全部在一个文件中,则完全按原样工作正常。我也不能在globals.h文件中CRGB leds[NUM_LEDS];之前使用extern,因为 CRGB 不是公认的变量类型。

谁能指出我正确的方向,我做错了什么?

您包含的头文件 (BlynkSimpleEsp8266.h) 在第 90 行到 92 行包含以下内容

static WiFiClient _blynkWifiClient;
static BlynkArduinoClient _blynkTransport(_blynkWifiClient);
BlynkWifi Blynk(_blynkTransport);

所有这些在我看来都是苏斯。最后一个看起来像给你错误消息的那个。这三行在包含此标头的每个 cpp 文件中创建对象。它们不应位于头文件中。将它们移到您的一个 cpp 文件中。

每个 cpp 文件(编译单元)都单独编译到一个对象文件,然后链接。不会跨编译单元边界记住定义。因此,这可能是链接器多个定义错误。