c語言函數(shù)接口設(shè)計(jì)的一些問題

在這里不記錄模塊功能劃分等問題老翘,假定函數(shù)接口功能已有明確的定義锈嫩。這樣的話就把討論局限在了函數(shù)名,傳入导梆,傳出參數(shù)的設(shè)計(jì)上了滓彰。

傳出參數(shù)(不一定指返回值)

  1. 通常情況下控妻,返回值都是int類型的數(shù)據(jù),返回0代表函數(shù)執(zhí)行成功揭绑,負(fù)數(shù)代表失敗饼暑。
#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    //此時不用釋放返回值,函數(shù)不可重入

    struct fan *fan = malloc(sizeof(*fan));
    fan->xx = xx;
    ....
    return fan  //需要釋放返回值彰居,函數(shù)可重入诚纸。
}

void fan_list()
{
    int i;
    struct fan *f;
    for(i=0;i<MAX;i++){
            f = get_fan_info(i);
            printf(...about fan..);
            free(f) ;   //到底要不要執(zhí)行這句。陈惰?畦徘??抬闯?
    }

    get_fan_info(i);// 只是單純的調(diào)一下這個函數(shù)井辆,可是會不會內(nèi)存泄漏?溶握?杯缺?
}

此時我們可以把接口設(shè)計(jì)成這樣

//返回值該不該,能不能釋放睡榆?很難從接口看出來
int get_fan_info(struct fan *fan,int id) 
{
    fan->xx = xx;
    ...
   return SUCCESS;
}

void fan_list()
{
    int i;
    struct fan fan;  //參數(shù)在椘妓粒空間上
    for(i=0;i<MAX;i++){
            get_fan_info(&fan,i); 
            printf(...about fan..);
    }
  
   get_fan_info(&fan,1) ;//只是單純的調(diào)一下這個函數(shù),會不會內(nèi)存泄漏胀屿?塘揣?
}

上面的實(shí)現(xiàn),其實(shí)很好的貫徹了 誰申請宿崭,誰釋放的標(biāo)準(zhǔn)亲铡。

  1. 有些情況下,返回值為指針效果很好
struct student *student_new(int id,const char *name);  //從函數(shù)名便可以看出,此返回值為malloc出來的奖蔓。

//另外一些明確知道返回的指針?biāo)玫淖兞吭薏荩芷谳^長的。
struct student *student_find_by_name(const char *name);//從內(nèi)存查找一個student.
//此類接口有風(fēng)險锭硼,需要程序員明確內(nèi)存關(guān)系房资,最好有良好的注釋。
  1. 返回值不應(yīng)該為結(jié)構(gòu)體檀头。這里就不做具體討論了轰异。

傳入?yún)?shù)

在函數(shù)內(nèi)部最好不要破壞傳入?yún)?shù)的內(nèi)存結(jié)構(gòu),傳入?yún)?shù)的排列順序最好要有邏輯性暑始。

  1. 不要破壞傳入?yún)?shù)的內(nèi)存結(jié)構(gòu)
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);    //此時會段錯誤
}

其實(shí)上面代碼主要問題是破壞了誰申請誰釋放的原則搭独。

  1. 傳入?yún)?shù)的順序要有一定的邏輯性
//注意都是dest在錢,src在后
void* memcpy(void *desc,const void  *src,size_t n);
char *strcpy(char *desc,const char *src);
//思考此時為什么返回值設(shè)計(jì)為指針類型廊镜?牙肝?
//第一個參數(shù)為struct student *
int student_set_id(struct student *s,int id);
int student_set_name(struct student *s,const char *name);
  1. 傳入?yún)?shù)的變量名,一定要表意清晰嗤朴,盡量不用縮寫配椭,內(nèi)部變量可使用縮寫。
int student_set_name_by_id(struct student *student,const char *name)
{
       struct student *s = student_find_by_name(name); //內(nèi)部采用縮寫雹姊,參數(shù)不用縮寫股缸。
       if
          ...
      return SUCCESS;
}

函數(shù)名

函數(shù)名要表意清晰,遵守命名規(guī)范吱雏。幾個典型示例如下:

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

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末敦姻,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子歧杏,更是在濱河造成了極大的恐慌镰惦,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,843評論 6 502
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件犬绒,死亡現(xiàn)場離奇詭異旺入,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)懂更,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,538評論 3 392
  • 文/潘曉璐 我一進(jìn)店門眨业,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人沮协,你說我怎么就攤上這事龄捡。” “怎么了慷暂?”我有些...
    開封第一講書人閱讀 163,187評論 0 353
  • 文/不壞的土叔 我叫張陵聘殖,是天一觀的道長晨雳。 經(jīng)常有香客問我,道長奸腺,這世上最難降的妖魔是什么餐禁? 我笑而不...
    開封第一講書人閱讀 58,264評論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮突照,結(jié)果婚禮上帮非,老公的妹妹穿的比我還像新娘。我一直安慰自己讹蘑,他們只是感情好末盔,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,289評論 6 390
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著座慰,像睡著了一般陨舱。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上版仔,一...
    開封第一講書人閱讀 51,231評論 1 299
  • 那天游盲,我揣著相機(jī)與錄音,去河邊找鬼蛮粮。 笑死益缎,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的然想。 我是一名探鬼主播链峭,決...
    沈念sama閱讀 40,116評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼又沾!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起熙卡,我...
    開封第一講書人閱讀 38,945評論 0 275
  • 序言:老撾萬榮一對情侶失蹤杖刷,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后驳癌,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體滑燃,經(jīng)...
    沈念sama閱讀 45,367評論 1 313
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,581評論 2 333
  • 正文 我和宋清朗相戀三年颓鲜,在試婚紗的時候發(fā)現(xiàn)自己被綠了表窘。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,754評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡甜滨,死狀恐怖乐严,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情衣摩,我是刑警寧澤昂验,帶...
    沈念sama閱讀 35,458評論 5 344
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響既琴,放射性物質(zhì)發(fā)生泄漏占婉。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,068評論 3 327
  • 文/蒙蒙 一甫恩、第九天 我趴在偏房一處隱蔽的房頂上張望逆济。 院中可真熱鬧,春花似錦磺箕、人聲如沸奖慌。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,692評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽升薯。三九已至,卻和暖如春击困,著一層夾襖步出監(jiān)牢的瞬間涎劈,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,842評論 1 269
  • 我被黑心中介騙來泰國打工阅茶, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留蛛枚,地道東北人。 一個月前我還...
    沈念sama閱讀 47,797評論 2 369
  • 正文 我出身青樓脸哀,卻偏偏與公主長得像蹦浦,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子撞蜂,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,654評論 2 354

推薦閱讀更多精彩內(nèi)容

  • 原文地址:C語言函數(shù)調(diào)用棧(一)C語言函數(shù)調(diào)用棧(二) 0 引言 程序的執(zhí)行過程可看作連續(xù)的函數(shù)調(diào)用盲镶。當(dāng)一個函數(shù)執(zhí)...
    小豬啊嗚閱讀 4,610評論 1 19
  • 前言 把《C++ Primer》[https://book.douban.com/subject/25708312...
    尤汐Yogy閱讀 9,516評論 1 51
  • 指針是C語言中廣泛使用的一種數(shù)據(jù)類型。 運(yùn)用指針編程是C語言最主要的風(fēng)格之一蝌诡。利用指針變量可以表示各種數(shù)據(jù)結(jié)構(gòu)溉贿; ...
    朱森閱讀 3,440評論 3 44
  • __block和__weak修飾符的區(qū)別其實(shí)是挺明顯的:1.__block不管是ARC還是MRC模式下都可以使用,...
    LZM輪回閱讀 3,309評論 0 6
  • 為了更好的生活浦旱,必須好好工作宇色。 人生路.....不熟,需要面對得是更多未知的東西颁湖,請保持一個無畏的心宣蠕,勇往直前。
    LuckyS007閱讀 159評論 0 1