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;
    }

  • 相关阅读:
    hdu 2222 Keywords Search
    Meet and Greet
    hdu 4673
    hdu 4768
    hdu 4747 Mex
    uva 1513 Movie collection
    uva 12299 RMQ with Shifts
    uva 11732 strcmp() Anyone?
    uva 1401
    hdu 1251 统计难题
  • 原文地址:https://www.cnblogs.com/aimmiao/p/12107435.html
Copyright © 2011-2022 走看看