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

  • 相关阅读:
    Unity3d:Unknown type 'System.Collections.Generic.CollectionDebuggerView'1
    Unity3d:The requested item has been unloaded
    installshield 注册dll
    sql查找字符串是否包含字符
    asp获取勾选checkbox的值
    Pyqt5.2.1生成的.ui文件转换成.py
    scrapy爬虫的编写步骤
    IBM MQ 集成CXF 发送JMS 消息
    io输出流变为输入流
    hibernate flush clear的区别
  • 原文地址:https://www.cnblogs.com/aimmiao/p/12107435.html
Copyright © 2011-2022 走看看