#line ключевое слово в C - PullRequest
       1

#line ключевое слово в C

5 голосов
/ 18 августа 2011

Я пытаюсь понять какой-то код, и я наткнулся на ключевое слово, которое раньше никогда не видел. Я пытался гуглить, но ничего не нашел по этому поводу.

char *valtext;
#line 1 "Values.l"
#define INITIAL 0
#line 2 "Values.l"
int reserve(char *s);
#line 388 "lex.val.c"

Я включил весь блок, надеясь, что, возможно, кто-то может помочь мне понять этот кусок кода. Я не могу найти файлы в моей системе с именем «Values.l», и этот фрагмент кода находится в файле «lex.val.c».

Заранее спасибо.

Ответы [ 5 ]

10 голосов
/ 18 августа 2011
Директива

A #line устанавливает настройки компилятора для текущего имени файла и номера строки. Это влияет на символы __FILE__ и __LINE__, выходные данные, генерируемые ошибкой assert(), и диагностические сообщения (ошибки и предупреждения). Обычно он используется препроцессором, поэтому сообщения об ошибках и предупреждения могут ссылаться на исходный исходный код, а не на вывод препроцессора (который обычно отбрасывается к тому времени, когда вы видите какие-либо сообщения).

Он также используется другими инструментами, генерирующими исходный код на C, такими как lex / flex и yacc / bison, так что сообщения об ошибках могут ссылаться на входной файл, а не на (временный) сгенерированный код C.

Окончательная ссылка: стандарт C (pdf), раздел 6.10.4.

Линия вида

#line number

устанавливает текущий номер строки. Линия вида

#line number "file-name"

устанавливает номер строки и имя файла. Вы также можете сгенерировать одну из этих двух форм посредством расширения макроса; например:

#define LINE 42
#define FILE "foo.c"
#line LINE FILE
4 голосов
/ 18 августа 2011

Директива #line предназначена для использования препроцессоров, чтобы исходный номер строки источника мог быть сообщен компилятору C. Это делает так, чтобы сообщения об ошибках от компилятора правильно ссылались на номера строк, которые поймет пользователь.

Например, строка 12 вашего mycode.c может проходить через препроцессор и теперь будет строкой 183 mycode.tmp.cc. Если компилятор C обнаружит ошибку в этой строке, вам не нужно сообщать, что ошибка находится в строке 183 mycode.tmp.cc. Таким образом, компилятору C нужно дать «исходные координаты» каждой строки. Директива #line делает это, сообщая компилятору текущий номер строки и имя файла для использования в сообщениях об ошибках.

1 голос
/ 18 августа 2011
0 голосов
/ 18 августа 2011

Это сделано для того, чтобы номер строки изменился .

Это сделано для того, чтобы показать номера строк входного файла Lex, например, в сообщениях об ошибках и предупреждениях. Поскольку Lex генерирует код C, без директив #line ошибки компиляции и предупреждения не будут иметь никакого значения.

0 голосов
/ 18 августа 2011

Этот код прошел через препроцессор и, как таковой, размечен одним этапом компилятора, предназначенным для использования другим этапом того же компилятора.Используемые им функции не предназначены для вашего использования.

Файлы, на которые он ссылается, могут быть временными файлами, созданными компилятором при его запуске.

...