C ++ - 样式传递调用者文件和行到函数(相当于__FILE__和__LINE__)

时间:2014-04-11 11:09:01

标签: c++ macros compiler-construction

我知道,我的问题与此类似: 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文件时知道的内容。

知道成员函数的调用者可能对调试很有用 - 在哪个文件/行上调用了某些东西,这会导致以后出现问题。

1 个答案:

答案 0 :(得分:2)

我认为要使用可选功能,即按照您的建议将其作为功能声明的一部分,这并不容易或不可能。编译器必须在编译时插入所需的信息(因为文件和行信息在运行时丢失),但在那时它可能根本不知道在虚拟成员函数的情况下将调用哪个函数甚至普通的旧函数指针,以不可预测的方式分配。

但也许有可能让所有函数接收两个隐藏和未声明的参数,就像成员函数接收隐藏的this指针一样。在这种情况下,编译器不需要知道调用哪个函数,因为所有函数都接收隐藏的调用者行和文件参数。

即使可以,我也会看到以下问题:

  1. 这显然是一个重大变化 一个实现,可能是语言。 (我不确定 是否可以通过实施在幕后完成 它仍然声称符合今天的标准。)它会 C语言不可能用于所有实际目的,因为它会破坏 现有的ABI(除非微软这样做;-))。那不会是一个 C ++中的问题,无论如何ABI兼容性要差得多。
  2. 可能是一个性能问题,需要将两个参数传递给每个函数,尽管它们根本不需要它们,甚至可能是微小(例如嵌入式)系统上的内存问题,因为堆栈会增长快点。 (当然你可以声称他们不应该开始建立如此深的堆栈,但仍然。)
  3. 如果您认为该功能现在以宏的形式可用(名称空间污染的唯一缺点是完全可管理的),那么效益/努力比率根本不够好,我的猜测。