Включить один и тот же заголовочный файл в несколько файлов - переменная не была объявлена ​​в этой области - PullRequest
0 голосов
/ 01 октября 2018

У меня проблема со следующим кодом (это только фрагменты, а не полные файлы):

Menu.h

#ifndef MENU_H
#define MENU_H

#include <Adafruit_SSD1306.h>
#include <stdint.h>

#include <Config.h>

class MenuHeader; // forward declaration of class MenuHeader
class MenuPage; // forward declaration of class MenuPage

class Menu {
    MenuHeader* m_header{nullptr};
    MenuPage* m_pages[16]{}; // support up to 16 pages
    uint8_t m_pagesCount{0};
    uint8_t m_currentPage{0};

    public:
    void setHeader(MenuHeader* header);
    void addPage(MenuPage* page);
    void goToPage(const char* pageName);
    void next();
    void prev();
    void click();
    void draw(Adafruit_SSD1306* display);
};

#endif

Menu.cpp

#include <Menu.h>
#include <MenuHeader.h>
#include <MenuPage.h>

/* Some other definitions */

void Menu::draw(Adafruit_SSD1306* display) {
    if(m_header != nullptr) {
        display->setCursor(0, HEADER_HEIGHT - 1 + SCREEN_Y_OFFSET);
        m_pages[m_currentPage]->draw(display);
        m_header->draw(display);
    } else {
        display->setCursor(0, SCREEN_Y_OFFSET);
        m_pages[m_currentPage]->draw(display);
    }
}

Config.h

#ifndef CONFIG_H
#define CONFIG_H

#include <stdint.h>

constexpr uint8_t ENCODER_PIN_A = 14; // pin A of rotary encoder
constexpr uint8_t ENCODER_PIN_B = 12; // pin B of rotary encoder
constexpr uint8_t BUTTON_PIN = 13; // pin to which button is connected

constexpr uint8_t SCREEN_WIDTH = 128; // width of screen in pixels
constexpr uint8_t SCREEN_HEIGHT = 64; // height of screen in pixels
constexpr uint8_t CHARS_PER_LINE = 18; // how many characters fit in one line
constexpr uint8_t CHAR_WIDTH = SCREEN_WIDTH/CHARS_PER_LINE; // width of single character
constexpr uint8_t CHAR_HEIGHT = 10; // height of single char
constexpr uint8_t SCREEN_Y_OFFSET = CHAR_HEIGHT; // screen offset, if not using custom font set to 0

constexpr uint8_t HEADER_HEIGHT = 14; // menu header height in pixels

constexpr int8_t TIMEZONE = -1; // timezone

/* Some other not needed stuff */

#endif

Все заголовки (Menu.h, MenuHeader.h, MenuPage.h) включают Config.h.

Что ж, компилятору это не нравится.Выдает:

'HEADER_HEIGHT' was not declared in this scope
identifier "HEADER_HEIGHT" is undefined
'SCREEN_Y_OFFSET' was not declared in this scope
identifier "SCREEN_Y_OFFSET" is undefined

Все, что касается файла Menu.cpp.Я подумал, что если я включу файл Config.h в один из заголовков, который я затем включу в мой Main.cpp, он должен работать.Даже если я включаю config непосредственно в Main.cpp - те же самые ошибки происходят.Что я могу с этим поделать?

РЕДАКТИРОВАТЬ: Ну, странные вещи происходят.Если у меня есть #include <Config.h> в Menu.h, конфиг работает только в этом файле.Если я изменю его на #include "../Config/Config.h", он будет работать как в Menu.h, так и в Menu.cpp.В чем дело? Структура моей папки Использование <Config.h> - это функция platformio.Он автоматически находит все библиотеки и компилирует их.

Ответы [ 2 ]

0 голосов
/ 01 октября 2018

Нашел проблему.Оказалось, что Config, вероятно, зарезервированное имя, и поэтому оно не работает.Изменение имени на CFG устранило проблему.Спасибо за ваше время.

0 голосов
/ 01 октября 2018

Это не выглядит правильно:

#include <Config.h>

Вы включаете Config.h из системного пути включения.
Я предполагаю, что вы хотите включить Config.h из пути включения приложения.

#include "Config.h" // Note the quotes rather than the < >

Проверьте, куда вы включаете пути:

https://stackoverflow.com/a/11946295/14065

Проверьте, есть ли другой "Config.h" в одном из двух наборов путей.

Также обратите внимание:

Это также выглядит неправильно:

#include <stdint.h>

Это включает в себя версию C целочисленных типов.Что вряд ли правильно поместит эти определения в std.

против

Вы должны использовать правильные заголовочные файлы для C ++:

#include <cstdint>
...