Класс не называет тип с защитой заголовка - PullRequest
1 голос
/ 06 февраля 2020

Из-за ошибки мне потребовалось реализовать защиту заголовка в моем заголовочном файле и Cpp, так как я никогда не использовал его раньше, я не знаю, что пошло не так, потому что на некоторых классах это работает, а на одном он просто выиграл ' t ... Первоначально проблема была больше, но я думаю, что я сузил ее до источника проблемы.

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

1 Ответ

5 голосов
/ 06 февраля 2020

Как отметил орех в комментариях, первая проблема заключается в том, что #ifdef должно быть #ifndef. Теперь эта директива никогда не может быть оценена как true (поскольку этот макрос нигде не определен).

Кроме того, вы никогда не должны помещать защитные ключи в ваш файл cpp. Как следует из названия, вы используете их для защиты файлов, включенных в другие файлы, и файлы cpp никогда не должны нигде включаться.

Теперь, когда в вашем файле cpp включена защита, происходит следующее:

  1. Код читается сверху вниз
  2. ifndef встречается, это true (LED_HANDLER_H еще не определено)
  3. LED_HANDLER_H определено
  4. Другие заголовки включены
  5. Включен "Handlers / LedHandler.h"
    Теперь важно, что делает директива #include. Это простое копирование и вставка содержимого файла в другой файл.
  6. #ifdef LED_HANDLER_H изнутри LedHandler.h проверено, и это false (этот макрос уже определен в шаге 3)
  7. Все содержимое LedHandler.h пропущено из-за охраны.
...