我正在尝试为 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/