【问题标题】:Class does not name a type with header guard类没有命名带有标头保护的类型
【发布时间】:2020-02-05 22:55:20
【问题描述】:

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

ma​​in.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

【问题讨论】:

  • 你在LeadHandler.cpp#include &lt;FastLED.h中有错字

标签: c++ arduino esp8266 include-guards platformio


【解决方案1】:

正如 cmets 中的 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 from inside LedHandler.h 被选中,它是false(这个宏已经在步骤3中定义)
  7. LedHandler.h 的全部内容因包含保护而被跳过。

【讨论】:

  • 我之前有不同的名称,但是当我从 .cpp 中删除保护时,我收到以下错误:src\Handlers\LedHandler.cpp:7:1: error: 'LedHandler' does not name a type LedHandler::LedHandler(int length, uint16_t pin) {
  • @Maxdola 您是否将标题中的ifdef 更改为ifndef
  • 是的,我实际上过度阅读了对不起,这实际上解决了这个问题谢谢。
  • @Maxdola 后来在核桃评论后编辑了;)很高兴我能提供帮助。
猜你喜欢
  • 2015-04-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-21
相关资源
最近更新 更多