获取函数调用者的地址?

时间:2019-03-18 23:46:26

标签: c++

我正在使用__func__作为参数之一来调用函数,因此我可以存储调用该函数的函数的名称,而不必重新键入调用函数的名称。

有没有办法获取调用函数的地址-一种getaddress(__func __)

3 个答案:

答案 0 :(得分:0)

地址不会告诉您太多;我可以建议使用预定义的宏__FILE____LINE__吗?他们会告诉您当前的源文件(作为char*)和当前行。当您调用将那些参数作为参数传递的函数时,您会知道函数是从哪个文件/行调用的。

它们在使用时由编译器评估。如果您在函数内使用它们而不是将它们作为参数传递,它们会告诉您函数本身的文件/行。

答案 1 :(得分:0)

您可以声明函数指针,然后为它们分配特定的函数。这样一来,您就可以拥有表的指针数组或其他集合。

如果这对您有用,并且您接受了答案,那么我愿意在这里创建一个简短的摘要。 (我知道我不应该只用链接来回答。)但是,看看这种方法是否可以满足您的要求。 https://www.learncpp.com/cpp-tutorial/78-function-pointers/

答案 2 :(得分:0)

没有可移植的标准C ++方法来执行此操作。您可以使用编译器/ OS特有的技巧,与as in C相同,但是在C ++中它用处不大,因为它仅适用于extern "C"个名称(其中__FUNCTION__ / __func__匹配dlsym的期望)。

由于hack仅适用于extern "C"名称,这意味着您不能将其用于模板化函数,类方法或函数重载(相同的函数名称,不同的参数原型),这是相当严格的。请注意,即使在某些情况下,即使输入函数名称也已不起作用(例如,仅名称不能描述原型,因此函数重载将不起作用)。

我认为您需要重新考虑本质上要求reflection in C++的设计;优化编译器的本质是,您定义的大多数函数实际上不一定必须存在,或者如果确实存在,则它们仅以对编译器无意义的名称存在。当您要求从函数内部动态确定当前函数的地址时,您假设该函数以实际地址存在于最终编译的二进制文件中,此时可以很容易地将其内联到每个实际的调用站点中,与几乎相同的功能部分合并,等等。