С11 говорит что-нибудь о пустых единицах перевода? Если да, то в каком разделе?

c11

529 просмотра

1 ответ

65 Репутация автора

Я могу найти грамматику единицы перевода только в разделе 6.9, который выглядит следующим образом:

translation-unit: external-declaration
                  translation-unit external-declaration

Из этой грамматики кажется, что должно быть хотя бы одно внешнее объявление, что подразумевает, что пустая единица перевода не допускается. Однако я хотел бы знать, что требуется компилятору для такого сценария. Может ли кто-нибудь указать мне на описание в C11, если оно есть?

Автор: M. Zheng Источник Размещён: 18.07.2016 03:21

Ответы (1)


3 плюса

204373 Репутация автора

Решение

Учитывая это определение единицы перевода , попытка трактовать пустой исходный файл как единицу перевода приводит к синтаксической ошибке.

Раздел 5.1.1.3 стандарта C11 (см. Черновик N1570 ) требует диагностики для единицы перевода, которая нарушает синтаксическое правило или ограничение. Если диагностика является нефатальным предупреждением, и реализация все равно его переводит, результирующее поведение не определяется пропуском (4p2). Если реализации не удается выдать диагностическое сообщение, реализация не соответствует (по крайней мере, в том режиме, в котором вы ее вызвали), и стандарту больше нечего сказать по этому поводу.

Хотя поведение конкретной реализации не дает прямого ответа на вопросы о том, что говорит языковой стандарт, вот что gcc и clang делают с пустым исходным файлом (с опциями, позволяющими им пытаться соответствовать C11):

$ gcc -c -std=c11 -pedantic-errors empty.c
empty.c:1:0: error: ISO C forbids an empty translation unit [-Wpedantic]
$ clang  -c -std=c11 -pedantic-errors empty.c
empty.c:1:1: error: ISO C requires a translation unit to contain at least one declaration [-Werror,-Wempty-translation-unit]
^
1 error generated.
$
Автор: Keith Thompson Размещён: 18.07.2016 04:45
Вопросы из категории :
32x32