C++风格,将调用方文件和行传递给函数(相当于__file__和__line_)



我知道,我的问题与此类似:在不使用宏的情况下将调用程序__FILE____LINE_传递给函数

但我想知道,为什么没有c++等效的调用方文件和传递给函数的行。

拥有类、模板、默认参数和更严格的常量正确性会使许多宏用法过时,但当我想将调用方文件和行传递给函数时,我会遇到麻烦,原因有二:1。默认参数(很难用宏替换所有类型的调用),2。宏破坏类成员名称范围。(startTimer宏将是全局的)

考虑到函数的默认参数,为什么FILELINE宏没有默认的args样式替换?可以这样做:

void startTimer(int type, int id=0, string file = _CALLER_::FILE, int line = _CALLER_::LINE)

如果编译器在寻找startTimer的函数调用时,可以将id参数替换为0(其中没有提到),则应该可以将file和line替换为相应的CALLER成员,在本例中,这些成员取决于正在处理的文件和进行调用的行-编译器在解析cpp文件时知道这一点。

了解成员函数的调用方可能有助于调试——在哪个文件/行上调用了一些东西,这会导致以后出现问题。

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

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

即使这是可能的,我看到以下问题:

  1. 这显然是对一个实现,可能还有语言。(我不确定是否可以通过实现在幕后完成它仍然声称符合今天的标准。)会的在C中不可能实现所有实际目的,因为它会崩溃现有ABI(除非Microsoft这样做;-))。那就不那么重要了C++中的问题,ABI兼容性无论如何都要差得多
  2. 需要将两个参数传递给每个函数可能是一个性能问题,尽管它们通常根本不需要,甚至可能是小型(例如嵌入式)系统的内存问题,因为堆栈会增长得更快。(当然,你可以声称他们一开始就不应该建立这么深的堆栈,但仍然如此。)

如果你认为该功能现在是以宏的形式提供的(唯一的缺点是名称空间污染,这是完全可以控制的),我想收益/努力比根本不够好。

最新更新