假设我们在库中有一个C函数funA,在funA内它将调用其他函数funB,funC等。 funB和funC可能会回调funA。所以问题是:
是否可以在funA内部检测到这种情况,例如:

void funA(void) {
    if (...) {
         // Calling back to funA
    }

}

结论
  • 在单线程环境中,静态/全局变量将起作用。
  • 在多线程环境中,必须依赖TLS支持。
  • 还没有任何答案可以仅凭语言(C)级别的技巧就可以实现。
  • 最佳答案

    可以使用静态标志来完成。

    调用该函数时,如果未设置该标志,则将其设置并继续,否则立即返回。然后在函数末尾清除标志,以便再次输入。

    void funcA(void)
    {
        static int callback = 0;
    
        if (callback) return;
        callback = 1;
        ...
        callback = 0;
    }
    

    如果需要在多个线程中单独运行,则可以将变量声明为_Thread_local而不是static

    09-09 23:20