zoukankan      html  css  js  c++  java
  • c->再次封装已有函数的快速方法

    在C代码开发中,有时想清楚项目中调用特定函数的所有位置,可以借用几条shell指令轻松搞定。

    比如要弄清项目中的所有调用system函数的位置及其调用参数:

    Step1: 把项目中的所有源代码的system函数替换成SYSTEM_FUN

    grep "system(" -R | awk -F: '{print $1}'|sort -u |xargs sed -i "s/system(/SYSTEM_FUN(/g"

    Step2: 找一个公共的头文件,定义SYSTEM_FUN

    #define SYSTEM_FUN(str)   system_fun(__FILE__, __FUNCTION__, __LINE__, str)  

    Step3:再次封装system,需注意与原函数的返回参数一致
    int system_fun(const char *file, const char *function, int line, char *command){
        tcdbg_printf("[%s,%s,%d]%s ", file, function, line, command);
        int ret = system(command);
        return ret;
    }

    再比如弄清含有可变参数的函数sysmgr_getint的调用位置:

    int sysmgr_getint(char *xpath, ...);

    Step1:全部替换成SYSMGR_GETINT
    grep " sysmgr_getint (" -R | awk -F: '{print $1}'|sort -u |xargs sed -i "s/ sysmgr_getint (/SYSMGR_GETINT (/g"
    Step2:找一个公共的头文件加一个宏定义
    #define SYSMGR_GETINT(args...) sysmgr_getint_fun(__FILE__,__FUNCTION__,__LINE__,##args)
    Step3:再次封装原函数,需注意与原函数的返回参数一致
    int sysmgr_getint_fun(const char *file, const char *func, int line, char *xpath, ...)
    {
        int ret = 0;
        char tmp_path[1024] = {0};
        va_list ap;
     
        va_start(ap, xpath);
        vsnprintf(tmp_path, sizeof(tmp_path), (char *)xpath, ap);
        va_end(ap);
     
        ret = sysmgr_getint(tmp_path);
        printf("[%s,%s,%d] %d sysmgr getint (%s) ", file, func, line, ret, tmp_path);
        return ret;
    }

  • 相关阅读:
    大聊Python----SocketServer
    2、MySQL常见数据库引擎及比较?
    大聊Python----通过Socket实现简单的ssh客户端
    1、列举常见的关系型数据库和非关系型都有那些?
    uva12563 Jin Ge Jin Qu hao(01背包)
    UVA 12174 Shuffle(滑动窗口)
    C++中substr函数的用法
    uva11078
    11462 Age Sort(计数排序)
    UVA 11988 Broken Keyboard (a.k.a. Beiju Text) (链表,模拟)
  • 原文地址:https://www.cnblogs.com/aimmiao/p/12107435.html
Copyright © 2011-2022 走看看