У меня проблема со следующим кодом (это только фрагменты, а не полные файлы):
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>
это особенность платформы. Он автоматически находит все библиотеки и компилирует их.
Это не выглядит правильно:
#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>
Нашел проблему. Оказалось, что Config, вероятно, зарезервированное имя, и поэтому оно не работает. Изменение имени на CFG устранило проблему. Спасибо за ваше время.