c语言函数接口设计的一些问题

在这里不记录模块功能划分等问题,假定函数接口功能已有明确的定义。这样的话就把讨论局限在了函数名,传入,传出参数的设计上了。

传出参数(不一定指返回值)

  1. 通常情况下,返回值都是int类型的数据,返回0代表函数执行成功,负数代表失败。
#define         SUCCESS                      0
#define         TIMEOUT                      1
#define         PARAM_VALID                  2

int do_something()
{
        if()
            return TIMEOUT;
       if()
           return  PARAM_VALID;
      return SUCCESS;
}
  1. 返回值尽量不要是指针类型
//返回值该不该,能不能释放?很难从接口看出来
struct fan  *get_fan_info(int id)
{
    static struct fan  fan;
     fan.xx = xx;
     ....
     return &fan    //此时不用释放返回值,函数不可重入

    struct fan *fan = malloc(sizeof(*fan));
    fan->xx = xx;
    ....
    return fan  //需要释放返回值,函数可重入。
}

void fan_list()
{
    int i;
    struct fan *f;
    for(i=0;i<MAX;i++){
            f = get_fan_info(i);
            printf(...about fan..);
            free(f) ;   //到底要不要执行这句。????
    }

    get_fan_info(i);// 只是单纯的调一下这个函数,可是会不会内存泄漏???
}

此时我们可以把接口设计成这样

//返回值该不该,能不能释放?很难从接口看出来
int get_fan_info(struct fan *fan,int id) 
{
    fan->xx = xx;
    ...
   return SUCCESS;
}

void fan_list()
{
    int i;
    struct fan fan;  //参数在栈空间上
    for(i=0;i<MAX;i++){
            get_fan_info(&fan,i); 
            printf(...about fan..);
    }
  
   get_fan_info(&fan,1) ;//只是单纯的调一下这个函数,会不会内存泄漏??
}

上面的实现,其实很好的贯彻了 谁申请,谁释放的标准。

  1. 有些情况下,返回值为指针效果很好
struct student *student_new(int id,const char *name);  //从函数名便可以看出,此返回值为malloc出来的。

//另外一些明确知道返回的指针所引用的变量,生命周期较长的。
struct student *student_find_by_name(const char *name);//从内存查找一个student.
//此类接口有风险,需要程序员明确内存关系,最好有良好的注释。
  1. 返回值不应该为结构体。这里就不做具体讨论了。

传入参数

在函数内部最好不要破坏传入参数的内存结构,传入参数的排列顺序最好要有逻辑性。

  1. 不要破坏传入参数的内存结构
int send_request(const char *method,cJSON *param)
{
        ....
        free(param);
}

int do_something()
{
     cJSON *param = cJSON_CreateObject();
     cJSON_AddNumberToObject(param,"speed",123);
     send_request("set_fan_speed",param);
     cJSON_Delete(param);    //此时会段错误
}

其实上面代码主要问题是破坏了谁申请谁释放的原则。

  1. 传入参数的顺序要有一定的逻辑性
//注意都是dest在钱,src在后
void* memcpy(void *desc,const void  *src,size_t n);
char *strcpy(char *desc,const char *src);
//思考此时为什么返回值设计为指针类型??
//第一个参数为struct student *
int student_set_id(struct student *s,int id);
int student_set_name(struct student *s,const char *name);
  1. 传入参数的变量名,一定要表意清晰,尽量不用缩写,内部变量可使用缩写。
int student_set_name_by_id(struct student *student,const char *name)
{
       struct student *s = student_find_by_name(name); //内部采用缩写,参数不用缩写。
       if
          ...
      return SUCCESS;
}

函数名

函数名要表意清晰,遵守命名规范。几个典型示例如下:

struct student *student_new();
void student_destroy(struct student *student);

struct student *student_find_by_id(int id);
struct student *student_find_by_name(const char *name);

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,547评论 6 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,399评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,428评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,599评论 1 274
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,612评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,577评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,941评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,603评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,852评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,605评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,693评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,375评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,955评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,936评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,172评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 43,970评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,414评论 2 342

推荐阅读更多精彩内容

  • 原文地址:C语言函数调用栈(一)C语言函数调用栈(二) 0 引言 程序的执行过程可看作连续的函数调用。当一个函数执...
    小猪啊呜阅读 4,585评论 1 19
  • 前言 把《C++ Primer》[https://book.douban.com/subject/25708312...
    尤汐Yogy阅读 9,504评论 1 51
  • 指针是C语言中广泛使用的一种数据类型。 运用指针编程是C语言最主要的风格之一。利用指针变量可以表示各种数据结构; ...
    朱森阅读 3,422评论 3 44
  • __block和__weak修饰符的区别其实是挺明显的:1.__block不管是ARC还是MRC模式下都可以使用,...
    LZM轮回阅读 3,278评论 0 6
  • 为了更好的生活,必须好好工作。 人生路.....不熟,需要面对得是更多未知的东西,请保持一个无畏的心,勇往直前。
    LuckyS007阅读 153评论 0 1