类未命名带有标题保护的类型

Max*_*ola 1 c++ arduino include-guards esp8266 platformio

由于错误,我需要在我的头文件和 Cpp 中实现一个头文件保护,因为在我不知道出了什么问题之前我从未使用过它,因为在某些类上它可以工作,而在一个类上它不会......最初问题更大,但我想我把它缩小到问题的根源。

LedHandler.h

#ifdef LED_HANDLER_H
#define LED_HANDLER_H

#include <Arduino.h>
#include <Adafruit_NeoPixel.h>
#include <FastLED.h>

/* #include "Led/LedFunction.h"
#include "Led/LedStates.h"
#include "Led/Fading.h" */

class LedHandler {
  public:
    LedHandler(int length, uint16_t pin);
    void clear();
    void show();
    void setColor(int s, int r, int g, int b);

    Adafruit_NeoPixel getStrip();
    int getLength();
  private:
    /* LedStates &currentState;
    LedStates &targetState;
    Fader<LedStates> &ledFader; */

    int length;
    Adafruit_NeoPixel strip;
    CRGB* leds;
};

#endif
Run Code Online (Sandbox Code Playgroud)

LedHandler.cpp

#ifdef LED_HANDLER_H
#define LED_HANDLER_H

#include <Adafruit_NeoPixel.h>
#include <FastLED.h

#include "Handlers/LedHandler.h"


LedHandler::LedHandler(int length, uint16_t pin) {
...
}
...
#endif
Run Code Online (Sandbox Code Playgroud)

主程序

#define FASTLED_ESP8266_NODEMCU_PIN_ORDER

#include <Arduino.h>
#include <Scheduler.h>
#include <ESP8266WiFi.h>
#include <WiFiUdp.h>

#include "Tasks/WifiTask.h"
//#include "Tasks/Networking/UDPTask.h"

//#include "Handlers/GsonHandler.h"
#include "Handlers/LedHandler.h"

LedHandler ledHandler(60, D6);
Run Code Online (Sandbox Code Playgroud)

错误

src\main.cpp:14:1: error: 'LedHandler' does not name a type
 LedHandler ledHandler(60, D6);
 ^
*** [.pio\build\nodemcuv2\src\main.cpp.o] Error 1
Run Code Online (Sandbox Code Playgroud)

Yks*_*nen 5

正如 walnut 在评论中所指出的,第一个问题#ifdef应该是#ifndef. 现在这个指令永远不能被评估true(因为这个宏没有在任何地方定义)。

此外,您永远不应该在您的cpp文件中放置包含守卫。顾名思义,您可以使用它们来保护包含在其他文件中的文件,并且cpp永远不应将文件包含在任何地方。

现在,在您的cpp文件中包含保护,会发生以下情况:

  1. 代码从上到下读取
  2. ifndef遇到,它是trueLED_HANDLER_H尚未定义)
  3. LED_HANDLER_H 被定义为
  4. 包括其他标题
  5. 包含“Handlers/LedHandler.h”
    现在,重要的是#include指令的作用。这是将文件内容简单地复制并粘贴到另一个文件中。
  6. #ifdef LED_HANDLER_H从内部LedHandler.h检查,它是false(这个宏已经在步骤 3 中定义了)
  7. LedHandler.h由于包含守卫,跳过了全部内容。