我正在使用第三方库(mavlink)定义了许多都使用__attribute__((packed))
标记的结构,因此可以通过串行连接有效地传输它们(它是用C编写的,我正在使用它在C ++应用程序中)。当我收到并重建它们时,我想给它们添加一个时间戳字段。我认为最简单的方法是创建一个继承现有结构的新结构。即在mavlink库中定义了这个结构:
MAVPACKED(
typedef struct __mavlink_heartbeat_t {
uint32_t custom_mode;
uint8_t type;
uint8_t autopilot;
uint8_t base_mode;
uint8_t system_status;
uint8_t mavlink_version;
}) mavlink_heartbeat_t;
其中MAVPACKED
是应用__attribute__((packed))
的宏。 sizeof(mavlink_heartbeat_t)
返回9.如果我定义
struct new_heartbeat_t : mavlink_heartbeat_t
{
uint64_t timestamp;
};
sizeof(new_heartbeat_t)
返回24,所以看起来添加了7个填充字节(我假设结束了mavlink_heartbeat_t,以便时间戳从字节16开始。)
在做这个或者有更好的方法时,是否有任何问题或事情需要注意?
答案 0 :(得分:0)
继承是是一种关系。
心跳的本地表示真的是一种有线消息吗?我对此表示怀疑。
但它可能合理包含一个。
我会把它封装成这样的东西:
#include <cstdint>
#include <cstddef>
typedef struct __attribute__((packed)) __mavlink_heartbeat_t {
uint32_t custom_mode;
uint8_t type;
uint8_t autopilot;
uint8_t base_mode;
uint8_t system_status;
uint8_t mavlink_version;
} mavlink_heartbeat_t;
extern std::uint64_t now();
void sync_fetch_data(mavlink_heartbeat_t&);
void foo(uint8_t);
struct local_heartbeat
{
mavlink_heartbeat_t const& get_io_buffer() const {
return io_buffer_;
}
mavlink_heartbeat_t& prepare_receive() {
request_timestamp_ = now();
return io_buffer_;
}
void complete_receive() {
response_timestamp_ = now();
}
std::uint64_t get_response_timestamp() const {
return response_timestamp_;
}
private:
// stuff in here might have suspect alignment
mavlink_heartbeat_t io_buffer_;
// but these will be aligned for optimal performance
std::uint64_t request_timestamp_;
std::uint64_t response_timestamp_;
};
int main()
{
// create my local representation
local_heartbeat hb;
// prepare it to receive data
auto& buffer = hb.prepare_receive();
// somehow populate the buffer
sync_fetch_data(buffer); // could be async, etc
// notify the object that reception is complete
hb.complete_receive();
// now use the local representation
foo(hb.get_io_buffer().system_status);
}