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

Posted

技术标签:

【中文标题】Arduino/C++:从库中访问特定的结构头文件【英文标题】:Arduino/C++: Access specific header file of structs from library 【发布时间】:2019-03-11 01:31:25 【问题描述】:

(不确定这是否只是 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_

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

我能够从您的示例中获得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 ***/

请阅读有关how to ask a good question 的*** 指南,尤其是有关Mininimal, Complete and Verifiable Example 的部分。

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

【讨论】:

以上是关于Arduino/C++:从库中访问特定的结构头文件的主要内容,如果未能解决你的问题,请参考以下文章

如何从库中访问 :app 类?

EaselJS:从库中实例化对象后如何访问子项

从库中访问属性时出错

如何通过 MediaElement 从库中播放文件?

Git从库中移除已删除大文件

从库中复制文件时显示 ProgressDialog