Namespaces
Variants

Filename and line information

From cppreference.net
C++ language
General topics
Flow control
Conditional execution statements
Iteration statements (loops)
Jump statements
Functions
Function declaration
Lambda function expression
inline specifier
Dynamic exception specifications ( until C++17* )
noexcept specifier (C++11)
Exceptions
Namespaces
Types
Specifiers
constexpr (C++11)
consteval (C++20)
constinit (C++20)
Storage duration specifiers
Initialization
Expressions
Alternative representations
Literals
Boolean - Integer - Floating-point
Character - String - nullptr (C++11)
User-defined (C++11)
Utilities
Attributes (C++11)
Types
typedef declaration
Type alias declaration (C++11)
Casts
Memory allocation
Classes
Class-specific function properties
Special member functions
Templates
Miscellaneous

Changes the source code's line number and, optionally, the current file name, in the preprocessor.

Contents

Syntax

#line lineno (1)
#line lineno " filename " (2)

Explanation

1) Changes the current preprocessor line number to lineno . Expansions of the macro __LINE__ beyond this point will expand to lineno plus the number of actual source code lines encountered since.

2) Also changes the current preprocessor file name to filename . Expansions of the macro __FILE__ from this point will produce filename .

Any preprocessing tokens (macro constants or expressions) are permitted as arguments to #line as long as they expand to a valid decimal integer optionally following a valid character string.

lineno must be a sequence of at least one decimal digit (the program is ill-formed, otherwise) and is always interpreted as decimal (even if it starts with 0 ).

If lineno is 0 or greater than 32767 (until C++11) 2147483647 (since C++11) , the behavior is undefined.

Notes

This directive is used by some automatic code generation tools which produce C++ source files from a file written in another language. In that case, #line directives may be inserted in the generated C++ file referencing line numbers and the file name of the original (human-editable) source file.

Example

#include <cassert>
#define FNAME "test.cc"
int main()
{
#line 777 FNAME
        assert(2+2 == 5);
}

Possible output:

test: test.cc:777: int main(): Assertion `2+2 == 5' failed.

References

  • C++23 standard (ISO/IEC 14882:2024):
  • 15.7 Line control [cpp.line]
  • C++20 standard (ISO/IEC 14882:2020):
  • 15.7 Line control [cpp.line]
  • C++17 standard (ISO/IEC 14882:2017):
  • 19.4 Line control [cpp.line]
  • C++14 standard (ISO/IEC 14882:2014):
  • 16.4 Line control [cpp.line]
  • C++11 standard (ISO/IEC 14882:2011):
  • 16.4 Line control [cpp.line]
  • C++98 standard (ISO/IEC 14882:1998):
  • 16.4 Line control [cpp.line]

See also

a class representing information about the source code, such as file names, line numbers, and function names
(class)
C documentation for Filename and line information