首页 > 解决方案 > 如何为每个函数调用或宏构建一个具有一个字段的结构?

问题描述

我想通过套接字发送一个结构。我不想使用 IDL 来指定结构,而是更动态地执行它。我想在代码中添加几个函数调用或宏调用,例如SendInt32(someInteger). 该结构应包含代码中每个函数调用的一个字段。同一代码行(例如循环)的多个调用应更新同一字段。如何动态构建这个结构?

还需要计算字段长度的总和。让我们暂时忽略远程端点如何读取结构。

SendInt32(1);    // (1)
SendInt16(2);    // (2)
for (int i = 0; i < 10; i++) 
{
  SendInt32(i);  // (3)
}

功能的实现Send应该产生一个结构,如下所示:

struct {
  uint16_t size = 10;  // sizeof(first) + sizeof(second) + sizeof(third)
  int32_t first = 1;   // (1)
  int16_t second = 2;  // (2)
  int32_t third = 9;   // (3)
}

这在C中可能吗?

标签: cstruct

解决方案


您可以将数据累积在字节缓冲区中,例如:

size_t packet_size = 0;

unsigned char buf[1024];

void AccumulateInt32(int32_t n)
{
  memcpy(buf + packet_size, &n, sizeof n);
  packet_size += sizeof n;
}

然后您可以接收packet_sizebuf[]实际发送。

字节序、错误检查和更好的 API 留作练习。


推荐阅读