line directive

M

Mantorok Redgormor

what is the purpose of the #line directive?
how is it suppose to be used?

I didn't see it mentioned in the faq and I can't make any sense of it from
the standard.
 
C

CBFalconer

Mantorok said:
what is the purpose of the #line directive?
how is it suppose to be used?
From N869:

6.10.4 Line control

Constraints

[#1] The string literal of a #line directive, if present,
shall be a character string literal.

Semantics

[#2] The line number of the current source line is one
greater than the number of new-line characters read or
introduced in translation phase 1 (5.1.1.2) while processing
the source file to the current token.

[#3] A preprocessing directive of the form

# line digit-sequence new-line

causes the implementation to behave as if the following
sequence of source lines begins with a source line that has
a line number as specified by the digit sequence
(interpreted as a decimal integer). The digit sequence
shall not specify zero, nor a number greater than
2147483647.

[#4] A preprocessing directive of the form

# line digit-sequence "s-char-sequence-opt" new-line

sets the presumed line number similarly and changes the
presumed name of the source file to be the contents of the
character string literal.

[#5] A preprocessing directive of the form

# line pp-tokens new-line

(that does not match one of the two previous forms) is
permitted. The preprocessing tokens after line on the
directive are processed just as in normal text (each
identifier currently defined as a macro name is replaced by
its replacement list of preprocessing tokens). The
directive resulting after all replacements shall match one
of the two previous forms and is then processed as
appropriate.

In other words it can be used to play games with the compilers
opinion of the current file name and the current source line
number.
 
S

Sidney Cadot

Mantorok said:
what is the purpose of the #line directive?
how is it suppose to be used?

This is usually used by code generators (e.g. lex/flex/bison/yacc), or
languages that compile to C instead of to assembly (e.g. f2c). If the
generated program contains a compile error, you can get an error/warning
in terms of the original file (which you wrote) instead of the
generated file (that the generator/translator wrote).

Example: a lex input file (sample.l) containing an error:

----- start of file
%%
fubar printf("a syntax error" 123);
%%
----- end of file

(pass it through lex)

$ lex sample.l
$ wc -l lex.yy.c

1499 lex.yy.c

(the generated file is no less than 1499 lines long)

$ cc lex.yy.c

sample.l: In function `yylex':
sample.l:2: error: parse error before numeric constant

(Thanks to #line, I get an error in terms of the original, while the
faulty printf statement actually ends up line 605 of lex.yy.c)


Best regards,

Sidney
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

No members online now.

Forum statistics

Threads
473,769
Messages
2,569,580
Members
45,055
Latest member
SlimSparkKetoACVReview

Latest Threads

Top