Почему вывод `struct T {double x};` отличается в C и C ++?

struct T{ double x};

В С это не создает проблем.

Но в C ++ это выдает следующую ошибку компиляции:

ожидаемый ‘;’ в конце декларации члена.

-4

Решение

Начиная с C11, «Спецификаторы структуры и объединения, синтаксис» (6.7.2.1/1):

структура декларирование:
    Спецификатор-спецификатор-лист структура-описатель-листвыбирать ;

Каждый элемент структуры заканчивается точкой с запятой. Ваше утверждение о том, что «нет проблем» не основано на том, что говорится в спецификации C. Если ваш компилятор принимает такой код, это не соответствующий компилятору C, или вы используете его неправильно. (Некоторые компиляторы имеют настраиваемый уровень соответствия стандартам.)

12

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

Парсер GCC для грамматики C реализован следующее:

  /* If no semicolon follows, either we have a parse error or
are at the end of the struct or union and should
pedwarn.  */
if (c_parser_next_token_is (parser, CPP_SEMICOLON))
c_parser_consume_token (parser);
else
{
if (c_parser_next_token_is (parser, CPP_CLOSE_BRACE))
pedwarn (c_parser_peek_token (parser)->location, 0,
"no semicolon at end of struct or union");
else if (parser->error
|| !c_parser_next_token_starts_declspecs (parser))
{
c_parser_error (parser, "expected %<;%>");
c_parser_skip_until_found (parser, CPP_CLOSE_BRACE, NULL);
break;
}

/* If we come here, we have already emitted an error
for an expected `;', identifier or `(', and we also
recovered already.  Go on with the next field. */
}

Вызывает функцию pedwarn на пропущенной точке с запятой.

Определение pedwarn может быть найден Вот. Это читает:

  • pedwarn для код, который принят GCC, но должен быть отклонен или диагностирован в соответствии с действующим стандартом, или это противоречит стандарту (либо по умолчанию, либо тот, который выбран -std=). Он также может диагностировать неопределенное поведение во время компиляции (но не UB во время выполнения). pedwarns стать ошибками с -pedantic-errors,
3

Почему вывод struct T{ double x}; отличается в C и C ++?

Пример определения структуры плохо сформирован в C и C ++.

C и C ++ — это разные языки, они используют разные парсеры (или любой другой компонент компилятора, который обнаружит эту ошибку). Вывод отличается, потому что люди принимали разные решения при реализации парсера компилятора C, чем когда был реализован парсер C ++.

Последний решил выдать ошибку, первая выдаёт просто предупреждение и успешно компилируется, несмотря на ошибку. Другой компилятор C может также отказаться от компиляции, и компилятор C ++ может принять программу (если он выдает предупреждение).

2

В общем-то, С язык любит точку с запятой гораздо больше, чем паскаль (Delphi). В твоем случае, С принимает struct T{ double x};, но C ++ уже требует struct T{ double x;};

-3
По вопросам рекламы ammmcru@yandex.ru
Adblock
detector