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 ¤tState;
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 后,会发生以下情况:
- 代码从上到下阅读
遇到ifndef
,就是true
(LED_HANDLER_H
还没有定义)
LED_HANDLER_H
定义
- 包括其他headers
- "Handlers/LedHandler.h"已收录
现在,#include
指令的作用很重要。很简单copy-and-paste把一个文件的内容放到另一个文件中。
#ifdef LED_HANDLER_H
from inside LedHandler.h
被检查,它是 false
(这个宏已经在步骤 3 中定义)
LedHandler.h
的全部内容因包含守卫而被跳过。
由于错误,我需要在我的头文件和 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 ¤tState;
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 后,会发生以下情况:
- 代码从上到下阅读 遇到
ifndef
,就是true
(LED_HANDLER_H
还没有定义)LED_HANDLER_H
定义- 包括其他headers
- "Handlers/LedHandler.h"已收录
现在,#include
指令的作用很重要。很简单copy-and-paste把一个文件的内容放到另一个文件中。 #ifdef LED_HANDLER_H
from insideLedHandler.h
被检查,它是false
(这个宏已经在步骤 3 中定义)LedHandler.h
的全部内容因包含守卫而被跳过。