Как член объединения может иметь указатель на экземпляр объединения?

Мы можем сделать это в одной строке кода, используя java 8

List ids = viewValues.stream().map(ViewValue::getId).collect(Collectors.toList());

. Для получения дополнительной информации: Java 8 - Потоки

3
задан Craig Graham 27 February 2019 в 15:16
поделиться

3 ответа

Вам необходимо переслать объявление tuEntry, чтобы вы могли использовать его в ts_EntrySubmenu. Вам нужно будет дать имя тегу этому объединению, чтобы на него можно было ссылаться позже.

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

typedef union tuEntry tuEntry;

typedef struct {
  char* entryName;
  const te_UIEntryType entryType;   // no default value
  tuEntry *entries[];
} ts_EntrySubmenu;


union tuEntry
{
  tsEntry entry;
  ts_EntryInt entryInt;
  ts_EntrySingle entrySingle;
  ts_EntryBool entryBool;
  ts_EntryDiscrete entryDiscrete;
  ts_EntrySubmenu entrySubmenu;
};
0
ответ дан dbush 27 February 2019 в 15:16
поделиться

Объявление указателя на некоторый T требует только того, чтобы было объявлено T, а не обязательно определено. Так что просто сделайте это:

union Entry;

typedef struct {
  char* entryName;
  const te_UIEntryType entryType = UI_ENTRY_SUBMENU;
  union Entry *entries[];
} ts_EntrySubmenu;

typedef union Entry {
  /* as before */
} tsEntry;
0
ответ дан Eric Postpischil 27 February 2019 в 15:16
поделиться

Проблема в том, что элемент подменю является членом объединения, поэтому его необходимо определить до объединения.

Да.

Но у него есть указатель на массив экземпляров этого объединения, что вызывает ошибку компиляции, потому что объединение еще не определено.

Для объявления указателя на этот тип необязательно указывать объединение. Это должно быть только объявлено . Определение может прийти позже.

Существует ли типобезопасный способ справиться с этим, или мой указатель в записи подменю должен быть пустым *?

Да. Форвард-объявлять объединение перед определением структуры, а потом помещать определение объединения. Это требует от вас предоставления тега для вашего типа объединения, иначе прямое объявление и последующее определение не будут ссылаться на тот же тип.

Пример:

typedef union entry tuEntry;

typedef struct {
  // ...
  tuEntry *entries[];
} ts_EntrySubmenu;


union entry
{
  // ...
  ts_EntrySubmenu entrySubmenu;
};

Кроме того, я не могу не заметить, что ваш исходный код полностью избегает объявления каких-либо тегов структуры или объединения. Я хочу убедиться, что вы понимаете, что это выбор стиля , и особенно, что ключевое слово typedef предназначено не для определения типов, а для объявления псевдонимов для имен типов. Ваш стиль по своей сути не ошибочен, но он не поддерживает то, что вы хотите сделать. Вам нужно использовать типы структуры и объединения с тегами, чтобы связать несколько объявлений одного и того же типа в одной и той же области видимости.

0
ответ дан John Bollinger 27 February 2019 в 15:16
поделиться
Другие вопросы по тегам:

Похожие вопросы: