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

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

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

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

  • Визуальная студия 2010
  • Встроенное рабочее место IAR для 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?

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


person jmstoker    schedule 13.09.2013    source источник
comment
Короткий ответ, да. Препроцессор и строковые литералы в стороне от размещения символов новой строки не имеют значения.   -  person john    schedule 14.09.2013


Ответы (4)


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

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

enum { value, };

что не охвачено всеми стандартами. Он рассматривается в C99 и более поздних версиях. Я не думаю, что конечная запятая поддерживается С++ 03, но поддерживается С++ 11.

person Dietmar Kühl    schedule 13.09.2013
comment
+1 за упоминание запятой в конце. Эта проблема частично вдохновила этот вопрос. - person jmstoker; 14.09.2013

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

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

person Mats Petersson    schedule 13.09.2013

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

Итак, это эквивалентно:

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

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

person ouah    schedule 13.09.2013
comment
Да, я знаю, что это необычно, и до сегодняшнего дня я никогда об этом не задумывался. - person jmstoker; 14.09.2013

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

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

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

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

or

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

person Gangadhar    schedule 13.09.2013
comment
можно использовать несколько пробелов (например, для целей отображения в текстовом редакторе) без какого-либо эффекта в окончательном коде. - person Gangadhar; 14.09.2013