Next: Null Directive, Previous: Diagnostics, Up: Preprocessing [Contents][Index]
Due to C’s widespread availability and low-level nature, it is often used as the target language for translation of other languages, or for the output of lexical analyzers and parsers (e.g., lex/flex and yacc/bison). Line control enables the user to track diagnostics back to the location in the original language.
The C compiler knows the location in the source file where each token came from: file name, starting line and column, and final line and column. (Column numbers are used only for error messages.)
When a program generates C source code, as the Bison parser generator does, often it copies some of that C code from another file. For instance parts of the output from Bison are generated from scratch or come from a standard parser file, but Bison copies the rest from Bison’s input file. Errors in that code, at compile time or run time, should refer to that file, which is the real source code. To make that happen, Bison generates line-control directives that the C compiler understands.
#line
is a directive that specifies the original line number
and source file name for subsequent code. #line
has three
variants:
#line linenum
linenum is a non-negative decimal integer constant. It specifies the line number that should be reported for the following line of input. Subsequent lines are counted from linenum.
#line linenum filename
linenum is the same as for the first form, and has the same
effect. In addition, filename is a string constant that
specifies the source file name. Subsequent source lines are recorded
as coming from that file, until something else happens to change that.
filename is interpreted according to the normal rules for a
string constant. Backslash escapes are interpreted, in contrast to
#include
.
#line anything else
anything else is checked for macro calls, which are expanded. The result should match one of the above two forms.
#line
directives alter the results of the __FILE__
and
__LINE__
symbols from that point on. See Predefined Macros.
Next: Null Directive, Previous: Diagnostics, Up: Preprocessing [Contents][Index]