c++ - 类没有命名带有标头保护的类型
问题描述
由于错误,我需要在我的 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 ¤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
主文件
#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
文件中加入包含守卫。顾名思义,您使用它们来保护包含在其他文件中的文件,并且cpp
文件永远不应包含在任何地方。
现在,在您的文件中包含保护cpp
,会发生以下情况:
- 代码从上到下阅读
ifndef
遇到,它是true
(LED_HANDLER_H
尚未定义)LED_HANDLER_H
被定义为- 包括其他标题
- 包含“Handlers/LedHandler.h”
现在,重要的是#include
指令的作用。这是将文件内容简单地复制并粘贴到另一个文件中。 #ifdef LED_HANDLER_H
从内部LedHandler.h
检查,它是false
(此宏已在步骤 3 中定义)LedHandler.h
由于包含保护,整个内容被跳过。
推荐阅读
- xamarin - Xamarin Forms UIBarButtonItem 自定义字体
- javascript - Javascript 如何处理诸如计时器倒计时之类的长任务
- javafx - 自定义组合框,JavaFX 中的居中文本
- ios - Xcode 9 iOS 11 BoringSSL 会话握手失败错误
- c - C 编程 - 将空格分隔的字符串读入 BST
- php - 在 PHP 的 Line Notify 中插入向上和下载箭头的表情符号
- java - 如何在java中获取带有时区的日期格式
- azure - 使用连接字符串在 Azure 中进行身份验证
- python - 合并来自不同样本的训练数据的问题
- android - Android 应用栏操作按钮偏离中心