Arduino/C++:从库中访问结构体的特定头文件

6l7fqoea  于 2023-11-16  发布在  其他
关注(0)|答案(1)|浏览(103)

(Not确定这是否仅是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类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

fdx2calv

fdx2calv1#

我可以从你的例子中得到一个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 = ...;

备注:

  • 请考虑直接使用namespaces,而不是使用类来创建单独的命名空间。这是C++的一个功能,在 Arduino 下可用。
namespace Library {

namespace DataTypes {

struct _theStructNameHere_t
{
    ...
};

...

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

} /*** namespace Library ***/

相关问题