Here is the problem:
I have a C source file main.c
and the corresponding preprocessed file main.i
. Given a line in main.i
, how can I get the corresponding line number in main.c
?
CodePudding user response:
The C standard does not specify this. GCC and Clang emit lines starting with #
followed by a space, a line number, a file name, and other information.. You can determine the line number in main.c
:
- Read the preprocessed file,
main.i
. After any line with#
followed by a space, a number, and a file name that is not “main.c”, read and ignore further lines until there is a#
followed by a space, a number, and “main.c”. Remember that number as the current line number. - Subsequent lines until another
#
line in this form are lines frommain.c
(after preprocessing) with consecutive line numbers continuing from the line number remembered above.
CodePudding user response:
When used as a separate phase producing a text file, the C preprocessor usually inserts #line
directives, sometimes appearing as bare #
directives providing the original file name, line number and other contextual information. #line
directives have this form:
#
line
pp-tokens new-line
which after macro substitution should become:
#
line
digit-sequence new-line
or
#
line
digit-sequence "
s-char-sequenceopt "
new-line
Where digit-sequence is the line number of the next list in the source stream and the s-char-sequenceopt is the name of the file to use for diagnostics and as a replacement for the __FILE__
macro. Subsequent newlines increment the line number thus defined.
#line
directives are produced by external programs that generate C code files to make compiler diagnostics point to the original source file.
C Compilers such as gcc and clang produce similar information in their preprocessing output in the form:
#
number filename other-information new-line
This syntax is not defined by the C Standard but very common in preprocessing output produced by C compilers. The C standard does not define this output, used mostly for debugging purposes.