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

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

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

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

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

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

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

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

回調(diào)函數(shù)可以達到動態(tài)綁定的作用,在一定程度上可以降低層與層之間的耦合。關于回調(diào)函數(shù),之前已經(jīng)有寫過一篇:C語言、嵌入式重點知識:回調(diào)函數(shù)。可能很多初學的小伙伴可能還不理解回調(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;
}

編譯、運行結果:

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

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

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、結構體內(nèi)置函數(shù)指針

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

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

例子:

#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 *常常用于函數(shù)地封裝比較多,當然也有用在其它地方,比如在結構體內(nèi)定義void*類型的私有指針方便擴展結構體。我們平時在封裝自己的函數(shù)時,也可以多考慮看看有沒有必要使用void*使得函數(shù)地通用性更強一些。

end

審核編輯 :李倩



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

    關注

    5143

    文章

    19561

    瀏覽量

    315453
  • 函數(shù)
    +關注

    關注

    3

    文章

    4372

    瀏覽量

    64314

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

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

收藏 人收藏

    評論

    相關推薦
    熱點推薦

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

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

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

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

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

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

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

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

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

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

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

    本內(nèi)容詳細介紹了嵌入式c語言編程的各項知識,包括嵌入式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的主要特點以及嵌入式C與標準C異同沖區(qū)重用

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

    C嵌入式

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

    嵌入式C++編程

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

    嵌入式C語言知識總結

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

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

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

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

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

    嵌入式C語言的結構特點

    嵌入式開發(fā)既有底層硬件的開發(fā)又涉及上層應用的開發(fā),即涉及系統(tǒng)的硬件和軟件,C語言既具有匯編語言操作底層的優(yōu)勢,又具有高級語言功能性強的特點,當之無愧地成為嵌入式開發(fā)的主流語言。在 S
    的頭像 發(fā)表于 11-24 16:16 ?1029次閱讀
    <b class='flag-5'>嵌入式</b><b class='flag-5'>C</b>語言的結構特點
    主站蜘蛛池模板: 天堂网传媒 | 国产毛片毛片精品天天看 | 午夜性a一级毛片 | 天天摸夜夜摸夜夜狠狠摸 | 性欧美在线 | 国产三级 在线播放 | 奇米成人影视 | 国产男女怕怕怕免费视频 | 五月月色开心婷婷久久合 | 丁香婷婷在线 | 日本片免费观看一区二区 | 日本三级hd高清电影 | 成人午夜免费视频毛片 | 男女交性无遮挡免费视频 | 国产在线视频你懂得 | 高清国产亚洲va精品 | 亚洲成人网页 | 香蕉网影院在线观看免费 | 91久久福利国产成人精品 | 日本资源在线观看 | 高清xxx | 三级在线国产 | 亚洲人成在线精品不卡网 | 亚洲伊人成人网 | 亚洲午夜影视 | 欧美一级特黄视频 | 黄色网址你懂得 | 欧美一级免费在线观看 | 色婷婷激情综合 | 欧美一级特黄高清免费 | 欧美 日韩 中文字幕 | 久久国产美女免费观看精品 | 久久semm亚洲国产 | 亚洲 [12p] | 国产大片免费观看中文字幕 | 性欧美欧美之巨大69 | 欧美视频精品一区二区三区 | 国产三级一区 | 中文4480yy私人免费影院 | 天天躁夜夜躁狠狠躁2024 | 国产网红主播精品福利大秀专区 |