c – 有一个对象的“模拟”,但是对于函数?

我已经搜索了引用和一般的网络,但是如果存在,我无法找出.

有没有办法在C中获取当前函数的指针?这是微不足道的,它应该存在.

在完美的世界中,我想要找到一种获取当前函数的std ::函数方法,但是即使是一个旧的样式指针也可以.

为了澄清为什么可能需要:我正在考虑Lambda函数中的递归或函数中的一般递归,在未来版本中名称更改的潜力很大.

解决方法

一般你不能.例如,在可以转换为原始函数指针的lambda中,没有(标准语言)方法获取函数内的指针.

但是,您可以通过宏__func__获得作为原始字符串的函数名称,只有编译器的最新版本才能为其提供该宏名称.

另外,如果你可以使用非便携式代码,还有几个针对编译器的内省设施(我只知道他们存在,但是必须google它们列出它们).

解决问题的新添加部分,如何让函数递归,并且仍然支持简单的名称更改和/或lambdas.

一种方法是使用std ::函数,但是更容易(并且可能更有效)是将递归函数定义为内部实现细节,例如,在命名空间或内部类中:

#include <iostream>
using namespace std;

void foo( int const x )
{
    struct Recursive {
        inline static void foo( int const x )
        {
            cout << x << ' ';
            if( x > 0 ) { foo( x - 1 ); }
        }
    };

    Recursive::foo( x );
    cout << endl;
}

auto main() -> int
{
    foo( 3 );
}

如何用lambda而不是命名函数做上面的操作:

#include <iostream>
using namespace std;

auto main() -> int
{
    auto const foo = []( int const x ) -> void
    {
        struct Recursive {
            inline static void foo( int const x )
            {
                cout << x << ' ';
                if( x > 0 ) { foo( x - 1 ); }
            }
        };

        Recursive::foo( x );
        cout << endl;
    };

    foo( 3 );
}

相关文章

本程序的编译和运行环境如下(如果有运行方面的问题欢迎在评...
水了一学期的院选修,万万没想到期末考试还有比较硬核的编程...
补充一下,先前文章末尾给出的下载链接的完整代码含有部分C&...
思路如标题所说采用模N取余法,难点是这个除法过程如何实现。...
本篇博客有更新!!!更新后效果图如下: 文章末尾的完整代码...
刚开始学习模块化程序设计时,估计大家都被形参和实参搞迷糊...