99精品伊人亚洲|最近国产中文炮友|九草在线视频支援|AV网站大全最新|美女黄片免费观看|国产精品资源视频|精彩无码视频一区|91大神在线后入|伊人终合在线播放|久草综合久久中文

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

幾個嵌入式C中的實(shí)用技巧

xCb1_yikoulinux ? 來源:一口Linux ? 作者:一口Linux ? 2022-04-21 14:21 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

大家好,我是雜燴君。本次給大家分享幾個嵌入式C中的實(shí)用技巧。

1、動態(tài)綁定、回調(diào)函數(shù)

回調(diào)函數(shù)可以達(dá)到動態(tài)綁定的作用,在一定程度上可以降低層與層之間的耦合。關(guān)于回調(diào)函數(shù),之前已經(jīng)有寫過一篇:C語言、嵌入式重點(diǎn)知識:回調(diào)函數(shù)。可能很多初學(xué)的小伙伴可能還不理解回調(diào)函數(shù),可以借助下圖來理解:

5fba2c48-c126-11ec-bce3-dac502259ad0.jpg

一般函數(shù)調(diào)用的順序都是上層函數(shù)(調(diào)用者)調(diào)用下層函數(shù)(被調(diào)用者)。而通過上圖我們可以看到下層模塊的函數(shù)2調(diào)用了上層模塊的函數(shù)3,這個調(diào)用過程與一般的調(diào)用過程相反,這個過程叫做回調(diào),這里上層模塊的函數(shù)3就是回調(diào)函數(shù)?;卣{(diào)函數(shù)的表現(xiàn)形式是函數(shù)指針。

C庫stdlib.h中帶有一個排序函數(shù):qsort函數(shù)。這個排序函數(shù)的原型為:

voidqsort(void*base,size_tnitems,size_tsize,int(*compar)(constvoid*,constvoid*));

參數(shù):

  • base-- 指向要排序的數(shù)組的第一個元素的指針。
  • nitems-- 由 base 指向的數(shù)組中元素的個數(shù)。
  • size-- 數(shù)組中每個元素的大小,以字節(jié)為單位。
  • compar-- 用來比較兩個元素的函數(shù),即函數(shù)指針(回調(diào)函數(shù))。
intcompar(constvoid*p1,constvoid*p2);

如果compar返回值小于0(< 0),那么p1所指向元素會被排在p2所指向元素的左面;

如果compar返回值等于0(= 0),那么p1所指向元素與p2所指向元素的順序不確定;

如果compar返回值大于0(> 0),那么p1所指向元素會被排在p2所指向元素的右面。

例子:

5fcfedf8-c126-11ec-bce3-dac502259ad0.jpg
#include
#include

intcompar_int(constvoid*p1,constvoid*p2)
{
return(*((int*)p1)-*((int*)p2));
}

voidtest_qsort(void)
{
intarr[5]={8,5,10,1,100};

printf("排序前:");
for(inti=0;i5;i++)
{
printf("%d",arr[i]);
}

qsort((int*)arr,5,4,compar_int);

printf("
排序后:");
for(inti=0;i5;i++)
{
printf("%d",arr[i]);
}
}

intmain(void)
{
test_qsort();
return0;
}

編譯、運(yùn)行結(jié)果:

5fe79296-c126-11ec-bce3-dac502259ad0.jpg

以上就是本次的分享,如有錯誤,歡迎指出,謝謝。這是第一彈,后續(xù)還會繼續(xù)分享更多實(shí)際開發(fā)中實(shí)用的編程小技巧及編程經(jīng)驗(yàn)。歡迎持續(xù)關(guān)注。本文只是盤點(diǎn)了一些實(shí)用小技巧,并不是說無論什么場景下都要這么用,還需具體問題具體分析。

2、使用宏給結(jié)構(gòu)體初始化

如果頻繁使用一個結(jié)構(gòu)體的話,使用使用宏來給結(jié)構(gòu)體進(jìn)行賦值是很方便的一種做法。

例子:

#include

#defineNEW_RECT(length,width){(length),(width)}

typedefstruct_Rect
{
intlength;
intwidth;
}Rect;

intmain(void)
{
Rectrect=NEW_RECT(10,5);
printf("rectlength=%d,width=%d
",rect.length,rect.width);
return0;
}

編譯、運(yùn)行結(jié)果:

5ffc9ba0-c126-11ec-bce3-dac502259ad0.jpg

這種方法在RT-Thread的底層gpio驅(qū)動中也有見到:

601a1b94-c126-11ec-bce3-dac502259ad0.jpg

3、結(jié)構(gòu)體內(nèi)置函數(shù)指針

我們常常構(gòu)造一些結(jié)構(gòu)體來存儲數(shù)據(jù),然后在一些函數(shù)中使用這些結(jié)構(gòu)體。下次不妨把數(shù)據(jù)與操作數(shù)據(jù)的函數(shù)綁在一起,更清晰明了。

相關(guān)文章:什么是不完全類型?

例子:

#include

#defineNEW_RECT(length,width){(calc_area),(length),(width)}

typedefstruct_Rect
{
int(*calc_area)(struct_Rect*pThis);
intlength;
intwidth;
}Rect;

intcalc_area(struct_Rect*pThis)
{
return(pThis->length*pThis->width);
}

intmain(void)
{
Rectrect=NEW_RECT(10,5);
printf("rectlength=%d,width=%d
",rect.length,rect.width);
printf("rectarea=%d
",rect.calc_area(&rect));
return0;
}

編譯、運(yùn)行結(jié)果:

602f9b68-c126-11ec-bce3-dac502259ad0.jpg

4、使用do{}while(0)封裝宏

#defineDBG_PRINTF(fmt,args...)
do
{
printf("<>",__FILE__,__LINE__,__FUNCTION__);
printf(fmt,##args);
}while(0)

具體說明可查閱往期文章:

C語言、嵌入式中幾個非常實(shí)用的宏技巧

5、void*

之前在C語言對象編程第一彈:封裝與抽象中有介紹過void*。void*其實(shí)我們平時都有接觸過,比如:

void*malloc(size_tsize);
void*memcpy(void*destin,void*source,unsignedn);
......

void *常常用于函數(shù)地封裝比較多,當(dāng)然也有用在其它地方,比如在結(jié)構(gòu)體內(nèi)定義void*類型的私有指針方便擴(kuò)展結(jié)構(gòu)體。我們平時在封裝自己的函數(shù)時,也可以多考慮看看有沒有必要使用void*使得函數(shù)地通用性更強(qiáng)一些。

end

審核編輯 :李倩



聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報(bào)投訴
  • 嵌入式
    +關(guān)注

    關(guān)注

    5152

    文章

    19675

    瀏覽量

    317655
  • 函數(shù)
    +關(guān)注

    關(guān)注

    3

    文章

    4381

    瀏覽量

    64903

原文標(biāo)題:分享幾個嵌入式 C 中的實(shí)用技巧

文章出處:【微信號:yikoulinux,微信公眾號:一口Linux】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。

收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評論

    相關(guān)推薦
    熱點(diǎn)推薦

    嵌入式開發(fā),你是如何理解嵌入式C編程的?

    `本文來探討嵌入式開發(fā)嵌入式C編程,看看跟您理解的一樣嗎?一、新手常常問的一個問題:C語言和嵌入式
    發(fā)表于 03-22 09:38

    分享幾個嵌入式學(xué)習(xí)的小技巧

    `1.安裝一個Linux的發(fā)行版本,能夠熟悉使用Linux,掌握Linux下的目錄結(jié)構(gòu)、基本命令、編輯器VI、編譯器GCC、調(diào)試器GDB和Make項(xiàng)目管理工具以及嵌入式開發(fā)環(huán)境的搭建。2.了解C語言
    發(fā)表于 03-07 17:39

    嵌入式系統(tǒng)的Python與C / C ++的相關(guān)資料分享

    嵌入式python c++ 盡管C / C ++編程語言有很多缺點(diǎn),但它們在嵌入式系統(tǒng)編程占主
    發(fā)表于 12-15 07:14

    幾個硬件和嵌入式軟件的問題

    幾個硬件和嵌入式軟件的問題1.乘法器應(yīng)用在哪些場合,一般哪些應(yīng)用會用到?2.雙電源運(yùn)放有哪些好處?看現(xiàn)在很多的運(yùn)放都是單電源了,雙電源運(yùn)放缺點(diǎn)是顯而易見的,電源系統(tǒng)更復(fù)雜,而且成本會增加3.IAP
    發(fā)表于 11-17 19:17

    嵌入式實(shí)時程序設(shè)計(jì)C/C++代碼的優(yōu)化

    本文簡單介紹了嵌入式實(shí)時程序設(shè)計(jì)的特點(diǎn)和嵌入式系統(tǒng)設(shè)計(jì)語言的選擇,著重介紹了以下幾種在嵌入式實(shí)時程序設(shè)計(jì)優(yōu)化
    發(fā)表于 08-07 08:47 ?15次下載

    嵌入式c語言編程(由淺入深)

    本內(nèi)容詳細(xì)介紹了嵌入式c語言編程的各項(xiàng)知識,包括嵌入式c語言編程,嵌入式C語言開發(fā)、
    發(fā)表于 11-02 14:37 ?0次下載
    <b class='flag-5'>嵌入式</b><b class='flag-5'>c</b>語言編程(由淺入深)

    嵌入式C編程

    嵌入式C編程,非常有用的資料,介紹嵌入式C語言編程
    發(fā)表于 12-29 17:29 ?0次下載

    嵌入式CC++語言精華文章集錦

    C/C++語言深層探索,包括嵌入式程序員需要知道的幾個問題,嵌入式系統(tǒng)編程修煉,基ARM的嵌入式
    發(fā)表于 03-04 15:20 ?13次下載

    嵌入式C的主要特點(diǎn)以及嵌入式C與標(biāo)準(zhǔn)C異同沖區(qū)重用

    嵌入式C發(fā)展迅速, 而且成為最受歡迎的語言之一, 主要因?yàn)樗哂袕?qiáng)大的功能。用嵌入式C加上一些匯編語言子程序, 就更能顯示嵌入式
    發(fā)表于 05-29 14:24 ?3939次閱讀

    C嵌入式

    1 嵌入式領(lǐng)域的C語言假定掌握了C語言基礎(chǔ),了解學(xué)習(xí)C嵌入式領(lǐng)域的應(yīng)用有哪些特殊之處。工作
    發(fā)表于 10-19 18:33 ?8次下載
    <b class='flag-5'>C</b>和<b class='flag-5'>嵌入式</b>

    嵌入式C++編程

    特點(diǎn)展示如何使用 C ++ 來構(gòu)建利用可用硬件資源的強(qiáng)大并發(fā)系統(tǒng)。從嵌入式編程入門和 C ++ 17 的最新特性開始,帶您了解優(yōu)秀編程的各個方面您將學(xué)習(xí)如何使用 C ++ 的并發(fā)性、內(nèi)
    發(fā)表于 11-04 10:36 ?10次下載
    <b class='flag-5'>嵌入式</b><b class='flag-5'>C</b>++編程

    嵌入式C語言知識總結(jié)

    1 嵌入式C語言總結(jié)從語法上來說C語言并不復(fù)雜, 但編寫優(yōu)質(zhì)可靠的嵌入式C程序并非易事,不僅需要熟知硬件特性和缺陷,還需要對編譯原理和計(jì)算機(jī)
    發(fā)表于 12-20 19:44 ?12次下載
    <b class='flag-5'>嵌入式</b><b class='flag-5'>C</b>語言知識總結(jié)

    嵌入式系統(tǒng)安全實(shí)用技巧

    嵌入式系統(tǒng)安全實(shí)用技巧
    的頭像 發(fā)表于 12-28 09:51 ?1035次閱讀

    嵌入式程序員應(yīng)知道的幾個基本問題

    電子發(fā)燒友網(wǎng)站提供《嵌入式程序員應(yīng)知道的幾個基本問題.pdf》資料免費(fèi)下載
    發(fā)表于 11-20 11:21 ?0次下載
    <b class='flag-5'>嵌入式</b>程序員應(yīng)知道的<b class='flag-5'>幾個</b>基本問題

    嵌入式C語言的結(jié)構(gòu)特點(diǎn)

    嵌入式開發(fā)既有底層硬件的開發(fā)又涉及上層應(yīng)用的開發(fā),即涉及系統(tǒng)的硬件和軟件,C語言既具有匯編語言操作底層的優(yōu)勢,又具有高級語言功能性強(qiáng)的特點(diǎn),當(dāng)之無愧地成為嵌入式開發(fā)的主流語言。在 S
    的頭像 發(fā)表于 11-24 16:16 ?1131次閱讀
    <b class='flag-5'>嵌入式</b><b class='flag-5'>C</b>語言的結(jié)構(gòu)特點(diǎn)