Это означает, что наиболее переносимым способом определения реализации методов классов шаблонов является определение их внутри определения класса шаблона.
template < typename ... >
class MyClass
{
int myMethod()
{
// Not just declaration. Add method implementation here
}
};
Это не обязательно. Раздел 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
, существует только для того, чтобы вы не делали ' Вы должны поставить где
перед вашим первым предложением и и
перед каждым последующим. Вы можете просто положиться на тот факт, что , где
уже есть, и просто использовать и
для всех добавленных вами.
Некоторые люди могут подумать, что это пахнет ленью, и они ' Правильно, но это не обязательно плохо: -)
Любой приличный оптимизатор запросов к СУБД должен иметь возможность вырезать такое постоянное предложение, прежде чем переходить к таблицам базы данных.
Как все говорят, запятая не обязательна. Но это новое в C99 (не было разрешено в C89) и будет разрешено в следующей версии C ++.
Еще одно обоснование состоит в том, чтобы провести различие между перечислителем «длины» и обычным перечислителем:
enum Items {
A,
B,
C,
LENGTH
};
Теперь вы можете указать в своем руководстве по кодированию, что последний элемент в вашем перечислении должен иметь запятую, но не если это элемент «Длина», который просто говорит, сколько элементов есть.
Это также помогает для автоматической генерации элементов (используя макросы / препроцессоры), как объясняют другие ответы.
В стандарте C89 последняя запятая не допускается. Полная остановка.
Это было обычное продолжение, чтобы позволить это; в частности, он был поддержан GCC, но стандарт явно запретил его.
В стандарте C99 допускается последняя запятая для симметрии с инициализаторами массива и структуры, которая всегда допускала конечную запятую на последнем элементе.
6.7.2.2 Спецификаторы перечисления
Синтаксис
Спецификатор перечисления: enum identifieropt {enumerator-list} enum identifieropt {enumerator-list,} перечислимый идентификатор
Основное преимущество разрешения конечных запятых состоит в том, что оно позволяет более легкую машинную генерацию (исходного кода C) - вам не нужно писать код специального случая для последнего (или, возможно, первого) элемента в списке инициализаторов. , Следовательно, такие программы, как Yacc и Lex, если не считать двух, могут быть немного проще.
Нет, это не обязательно. Причина в том, что это упрощает процесс вырезания и вставки кода, если вам не нужно беспокоиться о том, должна ли быть запятая или нет.
Нет, это не требуется - на самом деле я бы сказал, что это плохой стиль.
Это необязательно и полезно, если, скажем, вы используете макрос, например
#ifdef _FLAG
#define OPTS opt_four, opt_five,
#else
#define OPTS // none
#endif
enum {
opt_one,
opt_two,
opt_three,
OPTS
};
Нет, это не требуется и должно быть пропущено для ясности кода. Его присутствие / отсутствие не имеет никакого эффекта.
Его не требуется, однако некоторые компиляторы жалуются, если вы его добавите. например Visual Studio 6.
Одним из вариантов использования запятой является создание перечислений с использованием макросов c.
#define ELEMENT(x) x,
enum MyElements {
ELEMENT(a)
ELEMENT(b)
ELEMENT(c)
};
Этот шаблон полезен, если вам нужно сделать несколько вещей с элементами и определить их только один раз. Для более полного примера этого вы можете посмотреть код libiconv и утилиту iconv.
В объектно-ориентированном языке объекты определяются путем определения объектов, а не классов, хотя классы могут предоставлять некоторые полезные шаблоны для конкретных определений cookie-cutter для данной абстракции. В языке, ориентированном на классы, как, например, C #, объекты должны быть определены классами, и эти шаблоны обычно консервируются и упаковываются и становятся неизменяемыми до времени выполнения. Это произвольное ограничение, заключающееся в том, что объекты должны быть определены до времени выполнения и что определения объектов являются неизменяемыми, не является объектно-ориентированной концепцией; он ориентирован на класс.
Причина, по которой поддерживается запятая, заключается в том, что она (при условии, что элементы располагаются по одной в строке) позволяет удобно упорядочивать порядок элементов в перечислении с помощью вырезания / вставки или перетаскивания, а также позволяет вам закомментировать последний элемент без синтаксической ошибки. Пропуск запятой через запятую законен, но теряет эти преимущества обслуживания кода.Я забыл, но Ник совершенно прав. Я тоже использовал запятую с директивами компилятора. Без него условный код был бы намного сложнее и сложнее для чтения.
Я тоже использовал запятую с директивами компилятора. Без него условный код был бы намного сложнее и сложнее для чтения. Я тоже использовал запятую с директивами компилятора. Без него условный код был бы намного сложнее и сложнее для чтения.В других ответах об этом упоминается, но я просто хотел бы подчеркнуть, что трейлинговая запятая запрещена в стандартах C89 и C++, что делает ее проблема переносимости со старыми или необычными компиляторами. Вот полезная ссылка, которая объясняет эту и многие другие проблемы с Си/Си++: http://david.tribble.com/text/cdiffs.htm#C99-enum-decl