我知道,我的问题与此类似: Passing the caller __FILE__ __LINE__ to a function without using macro
但我想知道,为什么没有c ++等效的调用者文件和行传递给函数。
拥有类,模板,默认参数和更严格的const-correctness会使很多宏用法过时,但是当我想将调用者文件和行传递给函数时,我会遇到麻烦有两个原因:1。默认参数(很难用宏替换所有类型的调用),2。宏破坏类成员名称范围。 (startTimer宏将是全局的)
考虑函数的默认参数,为什么 FILE 和 LINE 宏没有default-args-style替换?可以这样做:
void startTimer(int type, int id=0, string file = _CALLER_::FILE, int line = _CALLER_::LINE)
如果编译器在查找startTimer的函数调用时,可以将id参数替换为0,在未提及的情况下,应该可以用相应的 CALLER 替换文件和行。成员,在此示例中依赖于文件,正在处理,以及调用的行 - 编译器在解析cpp文件时知道的内容。
知道成员函数的调用者可能对调试很有用 - 在哪个文件/行上调用了某些东西,这会导致以后出现问题。
答案 0 :(得分:2)
我认为要使用可选功能,即按照您的建议将其作为功能声明的一部分,这并不容易或不可能。编译器必须在编译时插入所需的信息(因为文件和行信息在运行时丢失),但在那时它可能根本不知道在虚拟成员函数的情况下将调用哪个函数甚至普通的旧函数指针,以不可预测的方式分配。
但也许有可能让所有函数接收两个隐藏和未声明的参数,就像成员函数接收隐藏的this指针一样。在这种情况下,编译器不需要知道调用哪个函数,因为所有函数都接收隐藏的调用者行和文件参数。
即使可以,我也会看到以下问题:
如果您认为该功能现在以宏的形式可用(名称空间污染的唯一缺点是完全可管理的),那么效益/努力比率根本不够好,我的猜测。