首页 > 解决方案 > 类没有命名带有标头保护的类型

问题描述

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

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

主文件

#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

标签: c++arduinoesp8266include-guardsplatformio

解决方案


正如 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由于包含保护,整个内容被跳过。

推荐阅读