Отображение c массивов - PullRequest
0 голосов
/ 01 марта 2020

Как можно C структуру, подобную

typedef struct {
    double a;
    int8_t b[5];
    int32_t c;
} Foo;

, успешно смоделировать в Swift? (целые числа фиксированной ширины для однозначности, не стесняйтесь заменить на char и int в своей голове)

При импорте структуры C в Swift массивы статического размера будут преобразованы в кортежи и память макет гарантированно будет идентичен. Однако пойти другим путем не так просто, потому что для этого нам нужно вручную указать потенциально длинные типы кортежей.

Чтобы уточнить: приведенная выше структура может быть смоделирована как

struct Foo {
  var a: Double
  var b: (Int8, Int8, Int8, Int8, Int8)
  var c: Int32
}

Есть ли способ упростить этот процесс, например, с помощью макроса препроцессора или специального типа, такого как c ++ std::array? Например, что-то вроде этого:

struct Foo {
  var a: Double
  var b: C_CHAR_ARRAY(5)
  var c: Int32
}

1 Ответ

1 голос
/ 01 марта 2020

У вас есть пара вопросов в вашем посте, поэтому я постараюсь ответить на все из них.

Макет структуры в Swift не упорядочен по исходному принципу, как в C, поэтому вы не можете написать то же самое структурировать представление в Swift. Компилятор может упаковать и переставить его по желанию. Поэтому, если вам нужен макет C, вы должны использовать C для определения структуры.

Что касается простого способа создания кортежа из определенного числа элементов, то простого способа не существует. сделать это. Вы можете определить его в C, написать вручную то, что вам нужно, или использовать инструмент, подобный Sourcery, для его генерации.

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