c++ - 除非用户指定自己的头文件,否则我可以编写一个包含默认头文件的库吗?

标签 c++ arduino header include conditional-statements

我正在尝试为 arduino 编写一个库,它(除其他外)通过串行总线将数据传输到另一个设备。我正在使用结构和字节数组的 union ,因此用户可以执行以下操作:

myData.dataStruct.temp = getTemp();

然后他们可以使用:

myLib.sendData(数据);

所以我的想法是拥有一个通用 header (默认 header ?),它定义了一个用户可以开始使用的通用结构和 union 。

genericDataStruct.h:


#ifndef Use_Custom_Data_Struct // Only use these declarations if no custom data struct

# ifndef DataPacket_generic_h
# define DataPacket_generic_h

typedef struct UserDataStruct_t{
    char            header[NSL_PACKET_HEADER_LENGTH];
    int8_t          b1;       ///<  b1  (Generic packet byte  1 of 35 )
    int8_t          b2;       ///<  b2  (Generic packet byte  2 of 35 )
    int8_t          b3;       ///<  b3  (Generic packet byte  3 of 35 )
    // ... etc
    int8_t          b35;      ///<  b35 (Generic packet byte 35 of 35 )

};


typedef union DataPacket_t {
    UserDataStruct_t payloadData;
    byte Packet[sizeof(UserDataStruct_t)];
};

# endif /* ThinSat_DataPacket_generic_h */

#endif /* Use_Custom_Data_Struct */

库函数使用这些 typedef,因此目前 myLib.h 包含 genericDataStruct.h

myLib.h:

#include "genericDataStruct.h"

// ... later on

class myLib
{

public:
    myLib();
    bool    sendData(DataPacket_t data);
}

目的是让用户以两种方式之一做事:

使用通用/默认数据结构:

#include "myLib.h"

DataPacket_t myData;

// later on

myData.payloadData.b1 = 0xFF;

然后他们继续他们的生活,或者...

使用他们自己的语义相关数据结构:

#define Use_Custom_Data_Struct
#include "customDataStruct.h"
#include "myLib.h"

DataPacket_t myData;

// later on

myData.payloadData.temp = 98.6;

当我尝试运行它时,由于我的通用 header 和用户 header 中有多个 typedef struct UserDataStruct_t 而出现编译器错误...

看来我找错人了。我认为 #defines 不会被预处理器在文件之间共享?所以这可能意味着包括守卫不会真正做我想做的事。

我不能 extern 结构声明/定义(我不认为......)所以我有点不知所措。

如果有人能指出正确的方向,我将不胜感激。对代码或架构更改持开放态度(任何帮助,真的)。

最佳答案

通用数据结构.h:

#ifndef USERSTRUCT
typedef struct UserDataStruct_t{
    char            header[NSL_PACKET_HEADER_LENGTH];
    int8_t          b1;       ///<  b1  (Generic packet byte  1 of 35 )
    int8_t          b2;       ///<  b2  (Generic packet byte  2 of 35 )
    int8_t          b3;       ///<  b3  (Generic packet byte  3 of 35 )
    // ... etc
    int8_t          b35;      ///<  b35 (Generic packet byte 35 of 35 )

};
#endif   
typedef union DataPacket_t {
    UserDataStruct_t payloadData;
    byte Packet[sizeof(UserDataStruct_t)];
};

自定义数据结构.h

#define USERSTRUCT
typedef struct UserDataStruct_t{
    char            header[NSL_PACKET_HEADER_LENGTH];
    float           temp;   // assuming byte order and float representation fit
// ...
};

但是,UserDatastruct_t 的大小必须匹配,因为在编译 myLib.cpp 时 customDatastruct.h 是未知的,myLib::sendData 只是使用 byte Packet[sizeof(UserDataStruct_t)]; union 的一部分。

关于c++ - 除非用户指定自己的头文件,否则我可以编写一个包含默认头文件的库吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55962132/

相关文章:

c++ - 具有 "Common" header 的实践

html - 需要帮助来影响标题和按钮

c++ - 使用 rand() 函数生成 ascii 值

c++ - 在 C++ Netbeans 中构建 DLL 文件

c++ - 具有灵活大小的结构的 MPI 派生数据类型

Arduino:列表?或等效的

css - 仅显示旋转图像的特定部分

c++ - boost:scoped_ptr 带有以 char* 作为输入类型的遗留 C 函数?

Arduino无需屏蔽即可上网

javascript - 红外线未返回 1 作为正确值