在多个文件中包含相同的头文件-在此范围内未声明“变量”

时间:2018-10-01 16:41:45

标签: c++ arduino platformio

我对以下代码有疑问(这些只是摘要,不是完整文件):

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中,它应该可以工作。即使我直接在Main.cpp中包含config-也会发生相同的错误。我该怎么办?

编辑: 好吧,奇怪的事情正在发生。如果我在Menu.h中有#include <Config.h>,则config仅在该文件中有效。如果我将其更改为#include "../Config/Config.h",则它在Menu.h和Menu.cpp中均可使用。这是怎么回事? My folder structure 使用<Config.h>是platformio的功能。它会自动找到所有库并进行编译。

2 个答案:

答案 0 :(得分:1)

这看起来不正确:

#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中。

<cstdint> vs <stdint.h>

您应该为C ++使用正确的头文件:

#include <cstdint>

答案 1 :(得分:0)

发现了一个问题。原来Config可能是保留名称,这就是为什么它不起作用的原因。将名称更改为CFG可以解决此问题。感谢您的宝贵时间。