Class 没有命名带有 header guard 的类型

Class does not name a type with header guard

由于错误,我需要在我的头文件和 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

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

main.cpp

#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);

错误

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

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

另外,你不应该在你的 cpp 文件中加入 include guards。顾名思义,您可以使用它们来保护包含在其他文件中的文件,并且 cpp 文件永远不应包含在任何地方。

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

  1. 代码从上到下阅读
  2. 遇到
  3. ifndef,就是trueLED_HANDLER_H还没有定义)
  4. LED_HANDLER_H定义
  5. 包括其他headers
  6. "Handlers/LedHandler.h"已收录
    现在,#include 指令的作用很重要。很简单copy-and-paste把一个文件的内容放到另一个文件中。
  7. #ifdef LED_HANDLER_H from inside LedHandler.h 被检查,它是 false (这个宏已经在步骤 3 中定义)
  8. LedHandler.h 的全部内容因包含守卫而被跳过。