Arduino / C ++: доступ к конкретному заголовочному файлу структур из библиотеки - PullRequest
1 голос
/ 11 марта 2019

(Не уверен, является ли это исключительно проблемой C / C ++)

В настоящее время я фрагментирую элементы большого проекта Arduino в библиотеки многократного использования - пока что это хорошо.

Однако некоторые методы в библиотеках возвращают специальные структуры, которые объявлены в файле data-types.h, содержащемся в каждой библиотеке.Проблема, с которой я столкнулся сейчас, заключается в том, что я не могу импортировать / использовать эти структуры в своем основном наброске.Я попытался объявить переменную класса DataTypes в главном файле заголовка библиотеки и получить доступ к структурам через него, но я получаю ошибку error: invalid use of 'struct DataTypes::_theStructNameHere_t'

Как мне поступить с доступом к этим структурам из библиотекив моем основном наброске объявить тип переменной?Я не хочу копировать файл заголовка, который содержит структуры из библиотеки, в мой эскиз, и я также не хочу создавать отдельную библиотеку только для этого одного файла заголовка структур!

Вот краткий пример того, что я имею в виду:

Main.cpp:

#include <Arduino.h>
#include <MyLibrary.h>

MyLibrary myLib;

void setup() {
    (This is declared in the library) myLib.dataTypes._theStructNameHere_t response = myLib.getASpecialValueWhichIsOfType_theStructNameHere_t()// Gives "error: invalid use of 'struct DataTypes::_theStructNameHere_t'""

    // Example usage of the struct:
    Serial.print("\n Loop Card Status: ");Serial.print(response.loop_status, HEX);
    if (response.number_allocated > 0) {
        Serial.print("\n Devices Allocated: ");Serial.print(response.number_allocated, HEX);
    } else {
        if (response.loop_status != 0x123) {
            // Some condition
        } else {
            // Something else
        }
    }
}

void loop() {
    ...
}

Структура библиотеки:

    src/
    - /data-types/
    - - data-types.h
    - MyLibrary.cpp
    - MyLibrary.h 

Заголовок библиотеки MyLibrary.h:

#ifndef   _MYLIBRARY_H_
#define   _MYLIBRARY_H_

#include <Arduino.h>

#include "./helpers/helpers.h"
...
#include "./data-types/data-types.h"

class MyLibrary {

    public:
        Uart *_commPort;
        Helpers helpers;
        ... 
        DataTypes dataTypes;

        DataTypes::_theStructNameHere_t getASpecialValueWhichIsOfType_theStructNameHere_t();

      ...

    protected:
    private:

};

#endif // _MYLIBRARY_H_

DataTypes Class data-types.h:

#ifndef   _RESPONSE_TYPES_H
#define   _RESPONSE_TYPES_H

class DataTypes
{
    public:
      struct _theStructNameHere_t
        {
            bool successful;
            uint8_t loop_status;
            uint8_t number_allocated;
            uint8_t highest_address;
            uint8_t number_inputs;
            uint8_t number_outputs;
        }
        ..even more..
    private:
}
#endif // _RESPONSE_TYPES_H

1 Ответ

0 голосов
/ 11 марта 2019

Мне удалось получить MCVE из вашего примера:

class DataTypes
{
    public:
    struct _theStructNameHere_t
    {

    };
};

class Library
{
    public:
        DataTypes dataTypes;
        DataTypes::_theStructNameHere_t getMyDataType();
};

int main(int argc, char *argv[])
{
    Library myLib;
    myLib.dataTypes._theStructNameHere_t response;
}

, которая выдает ошибку, похожую на ваш код:

~$ g++ test.cpp 
test.cpp: In function 'int main(int, char**)':
test.cpp:20:21: error: invalid use of 'struct DataTypes::_theStructNameHere_t'
     myLib.dataTypes._theStructNameHere_t response;

Проблема в том, что вы используете экземпляр для доступа к struct типу / имени. Чтобы исправить это, замените

myLib.dataTypes._theStructNameHere_t response = ...;

с

DataTypes::_theStructNameHere_t response = ...;

Примечания:

  • Вместо использования классов для создания отдельных пространств имен, пожалуйста, рассмотрите возможность использования пространств имен напрямую. Это функция C++, которая доступна под Arduino .
namespace Library {

namespace DataTypes {

struct _theStructNameHere_t
{
    ...
};

...

} /*** namespace Library::DataTypes ***/

} /*** namespace Library ***/
  • Пожалуйста, прочитайте StackOverflow рекомендации относительно , как задать хороший вопрос , в частности, раздел о Минимальный, полный и проверяемый пример .

  • Рано или поздно кто-то скажет вам, что такой вещи как C/C++ не существует; C равно C и C++ равно C++; Arduino живет в своем собственном мире, даже если основан на C++. Таким образом, вы можете удалить теги C и C++ из вашего вопроса.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...