开发者

How to make preprocessor generate a string for __LINE__ keyword?

__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 F开发者_运维技巧ind 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.


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());
}
0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜