【问题标题】:C function that executes some code when the function that called it exits当调用它的函数退出时执行某些代码的 C 函数
【发布时间】:2022-08-18 23:53:41
【问题描述】:

我想要一个函数来实现类似于列出的伪 C 代码中所示的行为。 我认为这可能通过使用函数指针来实现?

如果我梦想的这个模式很糟糕/不可能实现,我很乐意 如果它实现了相同的功能,则接受替代方案作为答案。

void log_func(const char* name, /*other args*/) {
  printf(\"called function: %s\\n\", name);
  if (/*calling function exited*/)
    printf(\"exited function: %s\\n\", name);
}

void example_func() {
  log_func(__func__); // __func__ macro is expanded to be function name as a c-string
  printf(\"This function does nothing\\n\");
}

输出:

called function: example_func
This function does nothing
exited function: example_func
  • 您可能必须以某种方式监视堆栈。
  • 您可以在 C++ 中利用析构函数执行类似的操作。我不知道 C 中有什么可以做你想做的事。
  • 在 C 中没有这样的可能
  • 我能看到的唯一方法是工具化调用函数的结尾。那会是一个选择吗?
  • IMO,最好的选择可能是在实际函数调用的任一方调用 log_func_call(__func__)log_func_exit(__func__) 函数。或stark\'s answer 中所示的包装技术。

标签: c pointers logging gcc callback


【解决方案1】:

这样的东西适用于返回 void 的函数。对于任意回报,必须更加聪明。

#include<stdio.h>

#define WRAPPER
#ifdef WRAPPER
#define LOG_FUNC(fname, ...) \
    do { \
    printf("called function: %s\n", #fname); \
    fname(__VA_ARGS__); \
    printf("exited function: %s\n", #fname); \
    } while(0)
#else
#define LOG_FUNC(fname, ...) \
    fname(__VA_ARGS__)
#endif
     
void phello(int n, char *s) {
    for(int i=0; i<n; i++) {
        printf("%s\n", s);
    }
}

int main()
{  
    LOG_FUNC(phello, 3, "Hello, World!");
}

输出

called function: phello
Hello, World!
Hello, World!
Hello, World!
exited function: phello

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-11-15
    • 1970-01-01
    • 1970-01-01
    • 2016-12-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多