Незнакомый синтаксис для инициализации массива / структуры, поиска объяснения - PullRequest
1 голос
/ 16 марта 2012

Я просматриваю «Руководство по моделированию процессора», предоставленное компанией OVP (продукт, похожий на qemu). В нем есть небольшой фрагмент кода, похожий на следующий:

static or1kDispatchTableC dispatchTable = {
  // handle arithmetic instructions
  [OR1K_IT_ADDI] = disDefault,
  [OR1K_IT_ADDIC] = disDefault,
  [OR1K_IT_ANDI] = disDefault,
  [OR1K_IT_ORI] = disDefault,
  [OR1K_IT_XORI] = disDefault,
  [OR1K_IT_MULI] = disDefault
};

Я никогда раньше не видел такой синтаксис. несущественные данные о C ++ удалены

На данный момент у меня нет возможности загружать / просматривать их материалы, чтобы посмотреть, как что-то определено, поэтому мой вопрос. Если вы узнаете этот синтаксис, можете ли вы взвесить?


1012 * редактировать *

or1kDispatchTableC - это typedef для указателя типа or1kDispatchTableCP, но я до сих пор не знаю, что такое or1kDispatchTableCP.

Ответы [ 2 ]

5 голосов
/ 16 марта 2012

Ну, если предположить, что ваша первая строка - опечатка, или or1kDispatchTableC - это тип массива, так что это фактически объявление массива, это похоже на явно инициализированный массив C11.Строка

[OR1K_IT_ADDI] = disDefault,

инициализирует элемент OR1K_IT_ADDI в disDefault.Оба из них должны быть константными выражениями - OR1K_IT_ADDI, вероятно, является тегом #define или enum.

Я почти уверен, что C ++ 11 НЕ поддерживает этот синтаксис, хотя некоторые компиляторы (которыетакже поддержка C11) может поддерживать его как расширение.

Из названий я бы предположил, что на самом деле это массив указателей на функции.

2 голосов
/ 18 марта 2012

Это называется назначенными инициализаторами и является функцией C (поддерживается с C99).Это позволяет напрямую обращаться к элементам массива и структуры / объединения, заполняя пробелы значениями по умолчанию.

struct foo { int a[10]; };
struct foo f[] = { [5].a[3] = 20 };

Теперь это приводит к 5 элементам struct foo, все инициализируются нулем, за которым следует шестой элементstruct foo с четвертым элементом a, инициализированным в 20.

Как и подозревал кто-то еще, это не поддерживается C ++.

...