Как построить структуру с одним полем для вызова функции или макроса? - PullRequest
0 голосов
/ 28 марта 2019

Я хочу отправить структуру через сокет. Я не хочу использовать 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?

1 Ответ

1 голос
/ 28 марта 2019

Вы можете накапливать свои данные в буфере байтов, например:

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_size и buf[] и фактически отправить.

Порядковый номер, ошибкапроверка и улучшение API оставлены в качестве упражнения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...