How to make preprocessor generate a string for __LINE__ keyword?

前端 未结 2 816
夕颜
夕颜 2021-02-02 08:10

__FILE__ is replaced with \"MyFile.cpp\" by C++ preprocessor. I want __LINE__ to be replaced with \"256\" string not with 256 integer. Without using m

相关标签:
2条回答
  • 2021-02-02 08:59

    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.

    0 讨论(0)
  • 2021-02-02 09:00

    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 讨论(0)
提交回复
热议问题