因为我现在也面临这个问题,我不能添加一个不同的答案,但也有效的问题问 给你,
我将提供一个例子来解决这个问题:
使用模板只获取函数在 C + + 中被调用的位置的行号。
背景: 在 C + + 中,可以使用非类型整数值作为模板参数。这与数据类型作为模板参数的典型用法不同。
因此,我们的想法是将这样的整数值用于函数调用。
#include <iostream>
class Test{
public:
template<unsigned int L>
int test(){
std::cout << "the function has been called at line number: " << L << std::endl;
return 0;
}
int test(){ return this->test<0>(); }
};
int main(int argc, char **argv){
Test t;
t.test();
t.test<__LINE__>();
return 0;
}
产出:
该函数在行号为0时被调用
该函数在第16行被调用
这里需要提到的一点是,在 C + + 11标准中,可以为使用模板的函数提供默认模板值。在 pre C + + 11中,非类型参数的默认值似乎只适用于类模板参数。因此,在 C + + 11中,不需要像上面那样有重复的函数定义。在 C + + 11中,拥有 const char * 模板参数也是有效的,但是不可能像前面提到的 给你那样将它们与 __FILE__或 __func__这样的文字一起使用。
所以最后,如果你使用 C + + 或 C + + 11,这可能是一个非常有趣的替代方案,而不是使用宏来获取调用线路。
format '%d' expects argument of type 'int', but argument 2 has type 'long int' [-Wformat=]
或者,代码可以强制更广泛的类型预先阻止此类警告。
printf("Not logical value at line number %ld\n", (long) __LINE__);
//or
#include <stdint.h>
printf("Not logical value at line number %jd\n", INTMAX_C(__LINE__));
#define xstr(a) str(a)
#define str(a) #a
fprintf(stderr, "Not logical value at line number %s\n", xstr(__LINE__));
fputs("Not logical value at line number " xstr(__LINE__) "\n", stderr);