Всегда ли несколько перечислений разделены символом новой строки, а затем запятой?

Возьми это перечисление как пример к вопросу

enum
{
one = 1
, two = 2
, three = 3
};

Я скомпилировал это перечисление со следующими компиляторами без проблем:

  • Visual Studio 2010
  • IAR Embedded Workbench для ARM 6.21
  • g ++ (Ubuntu / Linaro 4.6.3-1ubuntu5) 4.6.3
  • gcc (Ubuntu / Linaro 4.6.3-1ubuntu5) 4.6.3

Этот синтаксис гарантированно поддерживается в C99 и C ++ 03?

С учетом сказанного, я хотел бы избежать обсуждения о том, почему использовать этот синтаксис.

1

Решение

Дополнительный пробел или конкретный выбор пробелов совершенно не имеет значения в контексте определения enum и перечислители разделяются запятой. Таким образом, способ цитатного определения перечислителей определенно охватывается стандартом C ++ (все его версии) и стандартами C99 и более поздними версиями (я не претендую на C90, потому что я недостаточно знаком с C90 и не знаю иметь под рукой, но я считать enum там тоже работает определение). Кроме того, во всех этих случаях enum может быть анонимным

Интересным вопросом является поддержка запятой после последних перечислителей, например

enum { value, };

который не покрывается всеми стандартами. Это покрыто C99 и позже. Я не думаю, что конечная запятая поддерживается C ++ 03, но поддерживается C ++ 11.

4

Другие решения

Количество и выбор символа для пробела между токенами не имеют значения в языках C и C ++. Итак, это точно так же, как enum {one=1,two=2,three=3};, Единственный раз, когда вам нужны НЕКОТОРЫЕ пробельные символы, это если у вас есть два ключевых слова без разделителей «без слов», таких как запятая, скобка, двоеточие и т. Д.

Так что да, если это не приемлемо в компиляторе, этот компилятор является нестандартным компилятором.

2

C и C ++ позволяют добавлять произвольное количество пробелов и символов новой строки между токенами.

Так что это эквивалентно:

enum
{
one = 1,
two = 2,
three = 3
};

Но, конечно, у вас есть несколько необычный стиль …

2

Да, гарантированно поддерживается в C99 и C ++ 03

 enum
{
one = 1
, two = 2
, three = 3
};

считается таким же, как показано ниже

enum
{
one = 1 ,
two = 2 ,
three = 3
};

или же

enum
{
one = 1 ,
two = 2 ,
three = 3
};

0