五個(gè)嵌入式C語(yǔ)言中的實(shí)用技巧分享
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++利用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-08c/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-09C++任意線程通過(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-03Qt實(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