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

Arduino/C++: Access specific header file of structs from library

本文关键字:文件 结构 访问 Arduino      更新时间:2023-10-16

(不确定这是否仅是C/C 问题)

我目前正在将一个大型Arduino项目的元素分解为可重复使用的库 - 到目前为止,SOO很好。

但是,库中的许多方法返回特殊结构,这些结构在每个库中包含的data-types.h文件中声明。我现在遇到的问题是我无法在主要草图中导入/利用这些结构。我已经尝试在主库标头文件中声明DataTypes类的变量并通过它访问structs,但是我会收到错误error: invalid use of 'struct DataTypes::_theStructNameHere_t'

我将如何从主要草图中的库中访问这些结构以将其声明为变量类型?我不想复制包含库中构造的标题文件中的标题文件,我也不想为structs的单个标头文件创建一个单独的库!

这是我的意思的快速示例:

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_

数据类型类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

我能够从您的示例中获得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 ***/
  • 请阅读 stackoverflow 有关如何提出一个好问题的准则,特别是有关Mininimal,完整和可验证的示例的部分。

  • 迟早有人会告诉您C/C++没有这样的东西;CCC++C++;Arduino生活在自己的世界中,即使基于C++。因此,您可能需要从问题中删除CC++标签。