Требуется ли последняя запятая в C enum?

Это означает, что наиболее переносимым способом определения реализации методов классов шаблонов является определение их внутри определения класса шаблона.

template < typename ... >
class MyClass
{

    int myMethod()
    {
       // Not just declaration. Add method implementation here
    }
};
22
задан chqrlie 4 August 2018 в 16:21
поделиться

10 ответов

Это не обязательно. Раздел 6.7.2.2 из C99 перечисляет синтаксис как:

enum-specifier:
    enum identifieropt { enumerator-list }
    enum identifieropt { enumerator-list , }
    enum identifier
enumerator-list:
    enumerator
    enumerator-list , enumerator
enumerator:
    enumeration-constant
    enumeration-constant = constant-expression

Обратите внимание на первые две формы спецификатора перечисления , одну с завершающей запятой и одну без.

Одно преимущество Я видел, как использовать его в таких вещах, как:

enum {
    Val1,
    Val2,
    Val3,
} someEnum;

где, если вы хотите добавить в (например) Val4 и Val5 , вы просто копируете и вставляете Строка Val3 , не беспокоясь о настройке запятых.

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

Это можно сравнить с часто встречающимся SQL:

select fld1, fld2 from tbl where 1=1 and fld1 > 8

В этом случае , где 1 = 1 , существует только для того, чтобы вы не делали ' Вы должны поставить где перед вашим первым предложением и и перед каждым последующим. Вы можете просто положиться на тот факт, что , где уже есть, и просто использовать и для всех добавленных вами.

Некоторые люди могут подумать, что это пахнет ленью, и они ' Правильно, но это не обязательно плохо: -)

Любой приличный оптимизатор запросов к СУБД должен иметь возможность вырезать такое постоянное предложение, прежде чем переходить к таблицам базы данных.

37
ответ дан 29 November 2019 в 03:33
поделиться

Как все говорят, запятая не обязательна. Но это новое в C99 (не было разрешено в C89) и будет разрешено в следующей версии C ++.

Еще одно обоснование состоит в том, чтобы провести различие между перечислителем «длины» и обычным перечислителем:

enum Items {
    A,
    B,
    C,
    LENGTH
};

Теперь вы можете указать в своем руководстве по кодированию, что последний элемент в вашем перечислении должен иметь запятую, но не если это элемент «Длина», который просто говорит, сколько элементов есть.

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

15
ответ дан 29 November 2019 в 03:33
поделиться

В стандарте C89 последняя запятая не допускается. Полная остановка.

Это было обычное продолжение, чтобы позволить это; в частности, он был поддержан GCC, но стандарт явно запретил его.

В стандарте C99 допускается последняя запятая для симметрии с инициализаторами массива и структуры, которая всегда допускала конечную запятую на последнем элементе.

6.7.2.2 Спецификаторы перечисления

Синтаксис

  Спецификатор перечисления:
 enum identifieropt {enumerator-list}
 enum identifieropt {enumerator-list,}
 перечислимый идентификатор

Основное преимущество разрешения конечных запятых состоит в том, что оно позволяет более легкую машинную генерацию (исходного кода C) - вам не нужно писать код специального случая для последнего (или, возможно, первого) элемента в списке инициализаторов. , Следовательно, такие программы, как Yacc и Lex, если не считать двух, могут быть немного проще.

8
ответ дан 29 November 2019 в 03:33
поделиться

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

4
ответ дан 29 November 2019 в 03:33
поделиться

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

3
ответ дан 29 November 2019 в 03:33
поделиться

Это необязательно и полезно, если, скажем, вы используете макрос, например

#ifdef _FLAG
    #define OPTS opt_four, opt_five,
#else
    #define OPTS // none
#endif
enum {
  opt_one,
  opt_two,
  opt_three,
  OPTS
};
2
ответ дан 29 November 2019 в 03:33
поделиться

Нет, это не требуется и должно быть пропущено для ясности кода. Его присутствие / отсутствие не имеет никакого эффекта.

0
ответ дан 29 November 2019 в 03:33
поделиться

Его не требуется, однако некоторые компиляторы жалуются, если вы его добавите. например Visual Studio 6.
Одним из вариантов использования запятой является создание перечислений с использованием макросов c.

#define ELEMENT(x) x,

enum MyElements {
  ELEMENT(a)
  ELEMENT(b)
  ELEMENT(c)
};

Этот шаблон полезен, если вам нужно сделать несколько вещей с элементами и определить их только один раз. Для более полного примера этого вы можете посмотреть код libiconv и утилиту iconv.

0
ответ дан 29 November 2019 в 03:33
поделиться

В объектно-ориентированном языке объекты определяются путем определения объектов, а не классов, хотя классы могут предоставлять некоторые полезные шаблоны для конкретных определений cookie-cutter для данной абстракции. В языке, ориентированном на классы, как, например, C #, объекты должны быть определены классами, и эти шаблоны обычно консервируются и упаковываются и становятся неизменяемыми до времени выполнения. Это произвольное ограничение, заключающееся в том, что объекты должны быть определены до времени выполнения и что определения объектов являются неизменяемыми, не является объектно-ориентированной концепцией; он ориентирован на класс.

Причина, по которой поддерживается запятая, заключается в том, что она (при условии, что элементы располагаются по одной в строке) позволяет удобно упорядочивать порядок элементов в перечислении с помощью вырезания / вставки или перетаскивания, а также позволяет вам закомментировать последний элемент без синтаксической ошибки. Пропуск запятой через запятую законен, но теряет эти преимущества обслуживания кода.

Я забыл, но Ник совершенно прав. Я тоже использовал запятую с директивами компилятора. Без него условный код был бы намного сложнее и сложнее для чтения.

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

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

3
ответ дан 29 November 2019 в 03:33
поделиться

В других ответах об этом упоминается, но я просто хотел бы подчеркнуть, что трейлинговая запятая запрещена в стандартах C89 и C++, что делает ее проблема переносимости со старыми или необычными компиляторами. Вот полезная ссылка, которая объясняет эту и многие другие проблемы с Си/Си++: http://david.tribble.com/text/cdiffs.htm#C99-enum-decl

0
ответ дан 29 November 2019 в 03:33
поделиться
Другие вопросы по тегам:

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