[CPP] 使用三重宏展开将__LINE__转换为字符串的技巧
#define _sl_(x) #x
#define _strline_(x) _sl_(x)
#define _STR_LINE_ _strline_(__LINE__)
__LINE__不能直接使用 #define _sl_(x) #x转换成数字的原因是:
当宏参数是另一个宏的时候, 宏定义里有用'#'或'##'的地方宏参数是不会再展开,
因此__LINE__本身不展开,被当成了字符串,
即 _sl_(x) #x会被实际展开成_sl_(__LINE__) #__LINE__
解决办法就是中间多加一层转换宏: #define _strline_(x) _sl_(x),
在这一层由于没有#, __LINE__被展开成了实际数字, 以4869行例, 展开顺序为:
=> _STR_LINE_(__LINE__)
=> _strline_(4869)
=> _sl_(4869) #4869
所以_STR_LINE_(x)能够正确的返回了一个字符串