在c中添加唯一代码以启动和结束功能

时间:2016-08-02 07:19:21

标签: c gcc c-preprocessor

我正在寻找一种方法来自动将代码添加到函数的开头和开头。想法是我想稍后分析正在运行的代码。例如,我有以下功能:

void helloWorld(){
    printf("Hello World!\n");
}

void worldHello(){
    printf("World hello!\n");
}

我想要某种宏将它们扩展为:

void helloWorld(){
    printf("Function id 1 enter");
    printf("Hello World!\n");
    printf("Function id 1 exit");
}

void worldHello(){
    printf("Function id 2 enter");
    printf("World hello!\n");
    printf("Function id 2 exit");
}

每次使用我的宏时,id都是唯一给出的。对我如何实现这一点有任何好处吗?我看了GCC的“__COUNTER__”,但并没有像我想的那样真正地工作。

3 个答案:

答案 0 :(得分:4)

如果您正在使用GCC,请查看-finstrument-functions开关 - 请参阅https://gcc.gnu.org/onlinedocs/gcc/Instrumentation-Options.html#index-finstrument-functions它在进入和离开任何被调用的函数时基本上调用用户定义的函数。这有一些优点:

  • 您根本不必修改您的功能。
  • 无论函数如何退出,您的代码都会被调用(您的函数中可以包含任意数量的return并且不在乎)

答案 1 :(得分:3)

您可以使用函数名称而不是数字作为ID。因为函数名是唯一的。 例如,您可以使用宏:

#define START printf( "%s:%d Start \n", __func__, __LINE__)
#define END printf("%s:%d End \n", __func__, __LINE__)

或在内核中:

#define START pr_err(KBUILD_MODNAME ":%s:%d start \n", __func__, __LINE__)
#define END pr_err(KBUILD_MODNAME ":%s:%d end\n", __func__, __LINE__)

答案 2 :(得分:1)

使用__func__而不是__COUNTER__可能更具描述性。下面是一个宏的示例实现,可以执行您想要的操作。

#include <stdio.h>

#define WRAPPED_FUNC(funcname, ...) \
    funcname { \
        printf("Function %s entered\n", __func__); \
        __VA_ARGS__ \
        printf("Function %s exited\n", __func__); \
    }

WRAPPED_FUNC(
    void helloWorld(),
    {
        printf("Hello World!\n");
    }
)

WRAPPED_FUNC(
    void worldHello(),
    {
        printf("World hello!\n");
    }
)

int main() {
    helloWorld();
    worldHello();
    return 0;
}