欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

五個(gè)嵌入式C語(yǔ)言中的實(shí)用技巧分享

 更新時(shí)間:2022年12月30日 08:42:11   作者:編程小魚(yú)六六六  
這篇文章主要和大家分享一下五個(gè)嵌入式C語(yǔ)言中的實(shí)用技巧,文中的示例代碼講解詳細(xì),對(duì)我們學(xué)習(xí)C語(yǔ)言有一定的幫助,需要的可以參考一下

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

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

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

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

void qsort(void *base, size_t nitems, size_t size, int (*compar)(const void *, const void*));

參數(shù):

base-- 指向要排序的數(shù)組的第一個(gè)元素的指針。

nitems-- 由 base 指向的數(shù)組中元素的個(gè)數(shù)。

size-- 數(shù)組中每個(gè)元素的大小,以字節(jié)為單位。

compar-- 用來(lái)比較兩個(gè)元素的函數(shù),即函數(shù)指針(回調(diào)函數(shù))。

int compar(const void *p1, const void *p2);

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

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

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

例子:

#include <stdio.h>
#include <stdlib.h>
 
int compar_int(const void *p1, const void *p2)
{
 return (*((int*)p1) - *((int*)p2));
}
 
void test_qsort(void)
{
 int arr[5] = {8, 5, 10, 1, 100};
 
 printf("排序前:");
 for (int i = 0; i < 5; i++)
 {
  printf("%d ", arr[i]);
 }
 
 qsort((int*)arr, 5, 4, compar_int);
 
 printf("\n排序后:");
 for (int i = 0; i < 5; i++)
 {
  printf("%d ", arr[i]);
 }
}
 
int main(void)
{
 test_qsort();
 return 0;
}

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

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

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

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

例子:

#include <stdio.h>
 
#define  NEW_RECT(length, width)  {(length), (width)}
 
typedef struct _Rect
{
 int length;
 int width;
}Rect;
 
int main(void)
{
 Rect rect = NEW_RECT(10, 5);
 printf("rect length = %d, width = %d\n", rect.length, rect.width);
 return 0;
}

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

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

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

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

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

例子:

#include <stdio.h>
 
#define  NEW_RECT(length, width)  {(calc_area), (length), (width)}
 
typedef struct _Rect
{
 int (*calc_area)(struct _Rect *pThis);
 int length;
 int width;
}Rect;
 
int calc_area(struct _Rect *pThis)
{
 return (pThis->length * pThis->width);
}
 
int main(void)
{
 Rect rect = NEW_RECT(10, 5);
 printf("rect length = %d, width = %d\n", rect.length, rect.width);
 printf("rect area = %d\n", rect.calc_area(&rect));
 return 0;
}

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

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

#define DBG_PRINTF(fmt, args...)  \
do\
{\
    printf("<<File:%s  Line:%d  Function:%s>> ", __FILE__, __LINE__, __FUNCTION__);\
    printf(fmt, ##args);\
}while(0)

5、void*

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

void *malloc(size_t size) ;
void *memcpy(void *destin, void *source, unsigned n);
......

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

到此這篇關(guān)于五個(gè)嵌入式C語(yǔ)言中的實(shí)用技巧分享的文章就介紹到這了,更多相關(guān)嵌入式C語(yǔ)言實(shí)用技巧內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • C++派生訪問(wèn)說(shuō)明符小記(推薦)

    C++派生訪問(wèn)說(shuō)明符小記(推薦)

    下面小編就為大家?guī)?lái)一篇C++派生訪問(wèn)說(shuō)明符小記(推薦)。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2017-01-01
  • C++利用Opencv實(shí)現(xiàn)多個(gè)圓形檢測(cè)

    C++利用Opencv實(shí)現(xiàn)多個(gè)圓形檢測(cè)

    霍夫圓檢測(cè)是opencv中用來(lái)檢測(cè)圓的重要算法,簡(jiǎn)單的說(shuō),霍夫圓檢測(cè)就是對(duì)圖像中的弧線做切線,再在切點(diǎn)位置做切線的垂線,然后看這些垂線能交于一點(diǎn)的個(gè)數(shù),這個(gè)在方法中是自己設(shè)定的
    2022-08-08
  • C++調(diào)用Matlab函數(shù)求特征值

    C++調(diào)用Matlab函數(shù)求特征值

    這篇文章主要為大家詳細(xì)介紹了C++調(diào)用Matlab函數(shù)求特征值,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-06-06
  • c/c++ 標(biāo)準(zhǔn)庫(kù) bind 函數(shù)詳解

    c/c++ 標(biāo)準(zhǔn)庫(kù) bind 函數(shù)詳解

    bind是一組用于函數(shù)綁定的模板。在對(duì)某個(gè)函數(shù)進(jìn)行綁定時(shí),可以指定部分參數(shù)或全部參數(shù),也可以不指定任何參數(shù),還可以調(diào)整各個(gè)參數(shù)間的順序。這篇文章主要介紹了c/c++ 標(biāo)準(zhǔn)庫(kù) bind 函數(shù) ,需要的朋友可以參考下
    2018-09-09
  • 淺談C++11的std::mem_fn源碼解析

    淺談C++11的std::mem_fn源碼解析

    本文是基于gcc-4.9.0的源代碼進(jìn)行分析,std::mem_fn是C++11才加入標(biāo)準(zhǔn)的,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-06-06
  • C++任意線程通過(guò)hwnd實(shí)現(xiàn)將操作發(fā)送到UI線程執(zhí)行

    C++任意線程通過(guò)hwnd實(shí)現(xiàn)將操作發(fā)送到UI線程執(zhí)行

    做Windows界面開(kāi)發(fā)時(shí),經(jīng)常需要在多線程環(huán)境中將操作拋到主線程執(zhí)行,下面我們就來(lái)學(xué)習(xí)一下如何在不需要重新定義消息以及接收消息的情況下實(shí)現(xiàn)這一要求,感興趣的可以了解下
    2024-03-03
  • 如何利用Emacs來(lái)調(diào)試C++程序

    如何利用Emacs來(lái)調(diào)試C++程序

    本文給大家分享的是使用編輯器中的神器Emacs來(lái)調(diào)試C++程序的方法,非常的細(xì)致全面,有需要的小伙伴可以參考下
    2016-03-03
  • C/C++中extern函數(shù)使用詳解

    C/C++中extern函數(shù)使用詳解

    extern可以置于變量或者函數(shù)前,以標(biāo)示變量或者函數(shù)的定義在別的文件中,提示編譯器遇到此變量和函數(shù)時(shí)在其他模塊中尋找其定義。此外extern也可用來(lái)進(jìn)行鏈接指定
    2022-09-09
  • C++深入淺出講解缺省參數(shù)

    C++深入淺出講解缺省參數(shù)

    所謂缺省參數(shù),顧名思義,就是在聲明函數(shù)的某個(gè)參數(shù)的時(shí)候?yàn)橹付ㄒ粋€(gè)默認(rèn)值,在調(diào)用該函數(shù)的時(shí)候如果采用該默認(rèn)值,你就無(wú)須指定該參數(shù)。缺省參數(shù)使用主要規(guī)則:調(diào)用時(shí)你只能從最后一個(gè)參數(shù)開(kāi)始進(jìn)行省略,換句話說(shuō),如果你要省略一個(gè)參數(shù),你必須省略它后面所有的參數(shù)
    2022-07-07
  • Qt實(shí)現(xiàn)可以計(jì)算大數(shù)的簡(jiǎn)單計(jì)算器

    Qt實(shí)現(xiàn)可以計(jì)算大數(shù)的簡(jiǎn)單計(jì)算器

    計(jì)算器是我們生活中很常見(jiàn)的東西,它可以由多種語(yǔ)言多種方式來(lái)實(shí)現(xiàn)。本文主要介紹的是基于C++語(yǔ)言,由QT實(shí)現(xiàn)的可以計(jì)算大數(shù)的簡(jiǎn)單計(jì)算器,需要的可以參考一下
    2022-12-12

最新評(píng)論