在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

幾個嵌入式C中的實用技巧

xCb1_yikoulinux ? 來源:一口Linux ? 作者:一口Linux ? 2022-04-21 14:21 ? 次閱讀

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

1、動態綁定、回調函數

回調函數可以達到動態綁定的作用,在一定程度上可以降低層與層之間的耦合。關于回調函數,之前已經有寫過一篇:C語言、嵌入式重點知識:回調函數??赡芎芏喑鯇W的小伙伴可能還不理解回調函數,可以借助下圖來理解:

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

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

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

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

參數

  • base-- 指向要排序的數組的第一個元素的指針。
  • nitems-- 由 base 指向的數組中元素的個數。
  • size-- 數組中每個元素的大小,以字節為單位。
  • compar-- 用來比較兩個元素的函數,即函數指針(回調函數)。
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;
}

編譯、運行結果:

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

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

2、使用宏給結構體初始化

如果頻繁使用一個結構體的話,使用使用宏來給結構體進行賦值是很方便的一種做法。

例子:

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

編譯、運行結果:

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

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

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

3、結構體內置函數指針

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

相關文章:什么是不完全類型?

例子:

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

編譯、運行結果:

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語言、嵌入式中幾個非常實用的宏技巧

5、void*

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

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

void *常常用于函數地封裝比較多,當然也有用在其它地方,比如在結構體內定義void*類型的私有指針方便擴展結構體。我們平時在封裝自己的函數時,也可以多考慮看看有沒有必要使用void*使得函數地通用性更強一些。

end

審核編輯 :李倩



聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 嵌入式
    +關注

    關注

    5096

    文章

    19199

    瀏覽量

    308252
  • 函數
    +關注

    關注

    3

    文章

    4350

    瀏覽量

    63047

原文標題:分享幾個嵌入式 C 中的實用技巧

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

收藏 人收藏

    評論

    相關推薦

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

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

    分享幾個嵌入式學習的小技巧

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

    嵌入式系統的Python與C / C ++的相關資料分享

    嵌入式python c++ 盡管C / C ++編程語言有很多缺點,但它們在嵌入式系統編程占主
    發表于 12-15 07:14

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

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

    嵌入式實時程序設計C/C++代碼的優化

    本文簡單介紹了嵌入式實時程序設計的特點和嵌入式系統設計語言的選擇,著重介紹了以下幾種在嵌入式實時程序設計優化
    發表于 08-07 08:47 ?15次下載

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

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

    嵌入式C編程

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

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

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

    嵌入式C的主要特點以及嵌入式C與標準C異同沖區重用

    嵌入式C發展迅速, 而且成為最受歡迎的語言之一, 主要因為它具有強大的功能。用嵌入式C加上一些匯編語言子程序, 就更能顯示嵌入式
    發表于 05-29 14:24 ?3812次閱讀

    C嵌入式

    1 嵌入式領域的C語言假定掌握了C語言基礎,了解學習C嵌入式領域的應用有哪些特殊之處。工作
    發表于 10-19 18:33 ?8次下載
    <b class='flag-5'>C</b>和<b class='flag-5'>嵌入式</b>

    嵌入式C++編程

    特點展示如何使用 C ++ 來構建利用可用硬件資源的強大并發系統。從嵌入式編程入門和 C ++ 17 的最新特性開始,帶您了解優秀編程的各個方面您將學習如何使用 C ++ 的并發性、內
    發表于 11-04 10:36 ?10次下載
    <b class='flag-5'>嵌入式</b><b class='flag-5'>C</b>++編程

    嵌入式C語言知識總結

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

    嵌入式系統安全實用技巧

    嵌入式系統安全實用技巧
    的頭像 發表于 12-28 09:51 ?792次閱讀

    嵌入式程序員應知道的幾個基本問題

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

    嵌入式C語言的結構特點

    嵌入式開發既有底層硬件的開發又涉及上層應用的開發,即涉及系統的硬件和軟件,C語言既具有匯編語言操作底層的優勢,又具有高級語言功能性強的特點,當之無愧地成為嵌入式開發的主流語言。在 S
    的頭像 發表于 11-24 16:16 ?776次閱讀
    <b class='flag-5'>嵌入式</b><b class='flag-5'>C</b>語言的結構特點
    主站蜘蛛池模板: 亚洲综合校园春色 | 国产精品久久久久久久久kt | 亚洲精品一卡2卡3卡三卡四卡 | 久久精品国产大片免费观看 | 天天拍拍天天爽免费视频 | 在线网站你懂得 | 高黄视频 | 国产va免费精品高清在线 | 亚洲小说区图片区另类春色 | 视频网站黄色 | 色成网 | 女人张开腿男人猛桶视频 | 欧洲天堂网 | 成人青草亚洲国产 | 亚洲精品第一 | 人人看人人干 | 欧美一区中文字幕 | 六月婷操 | 色综合色综合色综合 | 亚洲一二 | 大香伊在人线免费 | 黄色在线看网站 | 国产无套粉嫩白浆 | 日xxxx| 欧美三级一区 | 天天在线天天综合网色 | 国外精品视频在线观看免费 | 国产精品二区三区免费播放心 | 中文字幕123区 | 欧美生活性色 | 老司机亚洲精品影院在线观看 | 日日摸人人看97人人澡 | 日本成人福利视频 | 美女被免费网站在线视频九色 | 欧美三级黄视频 | 18年大片免费在线观看 | 性做久久久久久免费观看 | 国产在线一区视频 | 亚洲一区二区三区免费在线观看 | 亚洲青草视频 | 国产精品网站在线进入 |