__FILE__
is replaced with "MyFile.cpp" by C++ preprocessor. I want __LINE__
to be replaced with "256" string not with 256 integer. Without using my own written functions like
toString(__LINE__);
Is that possible? How can I do it?
VS 2008
EDIT I'd like to automatically Find and Replace all throw;
statements with
throw std::runtime_error(std::string("exception at ") + __FILE__ + " "+__LINE__);
in my sources. If I use macro or function to convert __LINE__
into a string I'll need to modify each source file manually.
__LINE__ is a preprocessor macro that expands to current line number in the source file, as an integer. __LINE__ is useful when generating log statements, error messages intended for programmers, when throwing exceptions, or when writing debugging code.
The __FILE__ macro expands to a string whose contents are the filename, surrounded by double quotation marks ( " " ). If you change the line number and filename, the compiler ignores the previous values and continues processing with the new values. The #line directive is typically used by program generators.
In general, you can write a multi-line define using the line-continuation character, \ .
The __LINE__ is an inbuilt Macro in C programming language, it returns current line number of the code. Example: #include <stdio.h> int main(){ printf("Hello world\n"); printf("Line: %d\n",__LINE__); printf("How are you?\ n"); printf("Line: %d\n",__LINE__); printf("Bye bye!!!\n"); return 0; } Output.
You need the double expansion trick:
#define S(x) #x #define S_(x) S(x) #define S__LINE__ S_(__LINE__) /* use S__LINE__ instead of __LINE__ */
Addendum, years later: It is a good idea to go a little out of one's way to avoid operations that may allocate memory in exception-handling paths. Given the above, you should be able to write
throw std::runtime_error("exception at " __FILE__ " " S__LINE__);
which will do the string concatenation at compile time instead of runtime. It will still construct a std::string (implicitly) at runtime, but that's unavoidable.
EDIT: In response to request on the other answer, I added a non-macro version:
#include <iostream> #include <boost/lexical_cast.hpp> #include <string> #define B(x) #x #define A(x) B(x) void f(const char *s) { std::cout << s << "\n"; } int main() { f(A(__LINE__)); f(boost::lexical_cast<std::string>(__LINE__).c_str()); }
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With