【问题标题】:How to call a function just before returning in C?如何在返回 C 之前调用函数?
【发布时间】:2009-03-20 15:30:19
【问题描述】:

我正试图在函数返回给调用者之前在函数末尾执行一些操作。 为此,我想在特定上下文中覆盖 return。行为应该与 __cyg_profile_func_exit 相同,但我只想为某些功能激活它。

我不知道是否可以使用 gcc 内置函数或这种东西。

谢谢。

【问题讨论】:

    标签: c gcc


    【解决方案1】:

    GCC 对此有一个属性,当自动变量超出范围时调用一个函数,并将该变量的地址传递给它

    void cleanup_fn(int *p) {
        puts("cleanup called...");
    }
    
    void f(void) {
        int p __attribute__((cleanup(cleanup_fn)));
        puts("in f...");
    }
    
    int main(void) {
        puts("calling f...");
        f();
        puts("out of it...");
        return 0;
    }
    

    输出:

    calling f...
    in f...
    cleanup called...
    out of it...
    

    【讨论】:

    • 不错的 C-Fu。或者准确地说是 GCC-Fu。
    • 我从未听说过 GCC-Fu
    • 是C-Fu里面的一所学校,RMS是大师:)
    • 完全不可移植,不是 C,而是 GCC hack。
    • 对,它仅限于 GCC。我认为这没问题,因为他想知道 GCC 内置:)
    【解决方案2】:

    不,不是 C 本身。

    可以做的是写一个#define宏返回:

    #define RETURN(func) if(_DEBUG_) func; return ;
    #define RETURNV(func, val) if(_DEBUG_) func; return val ;
    

    (警告,你可能比我想更多地考虑保护特殊情况。)

    否则,您将需要编写一些东西来破坏幕后的代码,这就是分析器所做的。

    【讨论】:

    • 我可以用 LD_PRELOAD_PATH 做一些事情并在需要时覆盖返回吗? (纯静态方法...)
    • 你不能真正覆盖 C 中的 return,它不是函数调用。它只是一个关键字,它生成适当的指令以从子例程调用中返回。特定的编译器可以添加装饰,例如性能监视器,但这不是 C。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-11
    • 2017-05-17
    • 1970-01-01
    • 2013-05-15
    • 1970-01-01
    • 2021-08-02
    相关资源
    最近更新 更多