Ошибка: braces around scalar initializer

Тут новичок приходил на форум.
Я хотел его код скомпилировать, но получил ошибку.
Честно говоря не очень понимаю суть этой ошибки.
Минимальный код:

/*
 * Test
 */

enum eMenuKey {mkNull, mkBack, mkRoot, mkSetFreq, mkSetPhase, mkForm, mkSin, mkTri, mkSquare,
               mkSquareDiv2, mkInc, mkInc1, mkInc10, mkInc100, mkInc1000, mkAbout
              };

struct sMenuItem {
  eMenuKey Parent; // Ключ родителя
  eMenuKey Key; // Ключ
  char *Caption; // Название пункта меню
  void (*Handler)(); // Обработчик
};

struct sMenuItem Menu = {
  {mkNull, mkRoot, "Menu", NULL}
};

void setup() {
  // put your setup code here, to run once:

}

void loop() {
  // put your main code here, to run repeatedly:

}

Ошибка компиляции звучит полностью так:

sketch_jun01b:18:1: error: braces around scalar initializer for type 'eMenuKey'
 };
 ^
exit status 1
braces around scalar initializer for type 'eMenuKey'

А для чего в 16 struct ``?

Это от эксперимента осталось. Можно удалить - суть не поменяется.
Изначально её и не было.

/*
 * Test
 */

enum eMenuKey {mkNull, mkBack, mkRoot, mkSetFreq, mkSetPhase, mkForm, mkSin, mkTri, mkSquare,
               mkSquareDiv2, mkInc, mkInc1, mkInc10, mkInc100, mkInc1000, mkAbout
              };

struct sMenuItem {
  eMenuKey Parent; // Ключ родителя
  eMenuKey Key; // Ключ
  char *Caption; // Название пункта меню
  void (*Handler)(); // Обработчик
};

sMenuItem Menu = {
  {mkNull, mkRoot, "Menu", NULL}
};

void setup() {
  // put your setup code here, to run once:

}

void loop() {
  // put your main code here, to run repeatedly:

}
enum eMenuKey {mkNull, mkBack, mkRoot, mkSetFreq, mkSetPhase, mkForm, mkSin, mkTri, mkSquare,
               mkSquareDiv2, mkInc, mkInc1, mkInc10, mkInc100, mkInc1000, mkAbout
              };

struct sMenuItem {
  eMenuKey Parent; // Ключ родителя
  eMenuKey Key; // Ключ
  const char *Caption; // Название пункта меню
  void (*Handler)(); // Обработчик
};

struct sMenuItem Menu = {
  mkNull, mkRoot, "Menu", NULL
};

8 добавил const

13 убрал фигурные скобки

У меня собралось на gcc. Изначально ошибка повторилась.

Опоздал))
Что интересно, с фигурными скобками проходит как массив :

struct sMenuItem Menu[] = {
  {mkNull, mkRoot, "Menu", NULL}
};

P.S. Т.е. наличие фигурных скобок, ожидает массив структур:

struct sMenuItem Menu[] = {
  {mkNull, mkRoot, "Menu", NULL},
  {mkInc, mkInc10, "uuu", nullptr}
};

Ну так оно и есть. В изначальном коде там большой массив у него:

sMenuItem Menu = {
  {mkNull, mkRoot, "Menu", NULL},
  {mkRoot, mkSetFreq, "Set frequency", NULL},
  {mkRoot, mkSetPhase, "Set phase", NULL},
  {mkRoot, mkForm, "Set wave form", NULL},
  {mkForm, mkSin, "Sinusoidal", NULL},
  {mkForm, mkTri, "Triangular", NULL},
  {mkForm, mkSquare, "Square", NULL},
  {mkForm, mkSquareDiv2, "Square F / 2", NULL},
  {mkForm, mkBack, "Back", NULL},
  {mkRoot, mkInc, "Set frequency increment value", NULL},
  {mkInc, mkInc1, "1 HZ", NULL},
  {mkInc, mkInc10, "10 HZ", NULL},
  {mkInc, mkInc100, "100 HZ", NULL},
  {mkInc, mkInc1000, "1000 HZ", NULL},
  {mkInc, mkBack, "Back", NULL},
  {mkRoot, mkAbout, "About", NULL},
  {mkRoot, mkBack, "Back", NULL}
};

Это я уже сократил по минимуму.

Ничего не поменялось.

А зачем?

А зачем они там?

У Вас же две вложенные пары фигурных скобок.

Первая означает, что внутри какой-то агрегат (массив или структура). Вторая – то же самое ещё раз. Т.е. Вы инициализируете одну структуру не как одну структуру, а как массив, состоящий из одной структуры. Вот она и не понимает чего Вы от неё хотите.

Я понятно сказал?

Как массив должно компилироваться без ошибки. У меня , так всё норм.:

Спойлер
/*
 * Test
 */

enum eMenuKey {mkNull, mkBack, mkRoot, mkSetFreq, mkSetPhase, mkForm, mkSin, mkTri, mkSquare,
               mkSquareDiv2, mkInc, mkInc1, mkInc10, mkInc100, mkInc1000, mkAbout
              };

struct sMenuItem {
  eMenuKey Parent; // Ключ родителя
  eMenuKey Key; // Ключ
  char *Caption; // Название пункта меню
  void (*Handler)(); // Обработчик
};


struct sMenuItem Menu[] = {
  {mkNull, mkRoot, "Menu", NULL},
  {mkInc, mkInc10, "uuu", nullptr}
};

void setup() {
 Serial.begin(115200);
 Serial.println(sizeof(Menu[0]));

}

void loop() {
  // put your main code here, to run repeatedly:

}
Спойлер

Screenshot422 - копия

Да, понятно. Но без них массив не собрать. Разве частный случай (один элемент в массиве) может противоречить общему?

Странно… Но сейчас и у меня компилируется. “Что это было тогда”? ))

Квадратных скобок, наверно, не было

struct sMenuItem Menu[] = {

А ведь действительно! Вот это я дал маху! Стыдно….

Да, у меня тоже бывает, глаз замыливается, чай уже не юноши…)

А скобок не оказалось потому что код был вставлен не по правилам и там вместо них какой-то квадрат образовался. Который в иде не скопировался.

Нет, не может. Но тогда Вы и опишите свою переменную menu как массив. А то Вы её описали как одиночное значение, а инициализируете не одиночным значением, а массивом (пусть и из одного элемента - всё равно это массив). Вам же в первом же сообщении @Дим-мычъ написал как массив описывать.

Да, я уже с его помощью понял.