【GCC編譯優(yōu)化系列】宏定義名稱與函數(shù)同名是一種什么騷操作?
如果說(shuō)宏定義時(shí)C語(yǔ)言的精髓,那么當(dāng)你看到這樣的宏定義代碼的時(shí)候,你一定會(huì)感慨,什么時(shí)候把這個(gè)精髓敲掉,我不要了!
1 寫在前面2 問(wèn)題描述3 問(wèn)題分析4 問(wèn)題總結(jié)5 更多分享
1 寫在前面
有一天,在逛RT-Thread的技術(shù)論壇時(shí),看到這么一個(gè)問(wèn)題,說(shuō)某份代碼中,宏定義的名稱竟然與函數(shù)同名。怎么回事?
你可以去參考下原貼是怎么說(shuō)的:
RT-Thread-條件編譯的宏和函數(shù)名一樣是否不妥R(shí)T-Thread問(wèn)答社區(qū) - RT-Thread
2 問(wèn)題描述
如下圖所示:
**因?yàn)檫@個(gè)同學(xué)的代碼編譯不過(guò),所以他就提出了這樣的疑問(wèn):**究竟在C語(yǔ)言中宏定義名稱能不能與函數(shù)名同名?
3 問(wèn)題分析
為了解釋這個(gè)問(wèn)題,我特意找了一些偽代碼。
舉個(gè)例子,假如有這樣的代碼片段:
#define TEST_FUNC test_func
#define TEST_FUNC1
?
void test_func(void)
{
?
}
?
void TEST_FUNC1(void)
{
?
}
?
void jx_gatt_event_loop(void)
{
#ifdef TEST_FUNC
TEST_FUNC(); //編譯通過(guò)
#endif
#ifdef TEST_FUNC1
TEST_FUNC1(); //編譯失敗
#endif
}
**那么 **TEST_FUNC1 這邊就會(huì)報(bào)錯(cuò),但是 TEST_FUNC 是不會(huì)報(bào)錯(cuò)的:
error: expected identifier or '(' before 'void'
726 | void TEST_FUNC1(void)
查看一下預(yù)處理后的代碼長(zhǎng)啥樣:
3664
3665
3666 void test_func(void)
3667 {
3668
3669 }
3670
3671 void (void)
3672 {
3673
3674 }
3675
3676 void jx_gatt_event_loop(void)
3677 {
3678
3679 test_func();
3680
3681
3682 ();
3683
3684 }
3685
很明顯TEST_FUNC1全被替換成空了,自然編譯要報(bào)錯(cuò)。
嘗試把 #define TEST_FUNC1 注釋掉,編譯沒(méi)有問(wèn)題,因?yàn)轭A(yù)處理后的代碼長(zhǎng)這樣:
3666 void test_func(void)
3667 {
3668
3669 }
3670
3671 void TEST_FUNC1(void)
3672 {
3673
3674 }
3675
3676 void jx_gatt_event_loop(void)
3677 {
3678
3679 test_func();
3680
3681
3682
3683
3684 }
**通過(guò)上面的代碼分析,以及預(yù)處理后的文件的對(duì)比,我們可以發(fā)現(xiàn),宏定義的名稱與函數(shù)同名,本身并沒(méi)有問(wèn)題;但是如果宏定義對(duì)應(yīng)的函數(shù)名,沒(méi)有被定義,但代碼的上下文又調(diào)用了這個(gè)函數(shù)(宏),那么編譯上肯定是會(huì)報(bào)錯(cuò)的,因?yàn)?**找不到這個(gè)函數(shù) !
4 問(wèn)題總結(jié)
- 先不考慮寫代碼的規(guī)范性,如果單從語(yǔ)法上考慮,看看預(yù)處理后的文件有助于幫助排查問(wèn)題;
- 在C語(yǔ)言的教科書(shū)中,并沒(méi)有提到宏定義的名字不能與函數(shù)同名;所以這個(gè)根本就不是語(yǔ)法規(guī)則的限制;
- 代碼是首先是給人讀的,其次才是給機(jī)器運(yùn)行的;所以我個(gè)人是不太推薦這種過(guò)于隱晦的寫法;可讀性將大打折扣;
- 如果在代碼協(xié)作中看到這樣的代碼,我認(rèn)為應(yīng)該毫不猶豫地指正這個(gè)問(wèn)題,同時(shí)要求修正這樣的代碼。
5 更多分享
[架構(gòu)師李肯]
架構(gòu)師李肯 ( 全網(wǎng)同名 ),一個(gè)專注于嵌入式IoT領(lǐng)域的架構(gòu)師。有著近10年的嵌入式一線開(kāi)發(fā)經(jīng)驗(yàn),深耕IoT領(lǐng)域多年,熟知IoT領(lǐng)域的業(yè)務(wù)發(fā)展,深度掌握IoT領(lǐng)域的相關(guān)技術(shù)棧,包括但不限于主流RTOS內(nèi)核的實(shí)現(xiàn)及其移植、硬件驅(qū)動(dòng)移植開(kāi)發(fā)、網(wǎng)絡(luò)通訊協(xié)議開(kāi)發(fā)、編譯構(gòu)建原理及其實(shí)現(xiàn)、底層匯編及編譯原理、編譯優(yōu)化及代碼重構(gòu)、主流IoT云平臺(tái)的對(duì)接、嵌入式IoT系統(tǒng)的架構(gòu)設(shè)計(jì)等等。擁有多項(xiàng)IoT領(lǐng)域的發(fā)明專利,熱衷于技術(shù)分享,有多年撰寫技術(shù)博客的經(jīng)驗(yàn)積累,連續(xù)多月獲得RT-Thread官方技術(shù)社區(qū)原創(chuàng)技術(shù)博文優(yōu)秀獎(jiǎng),榮獲[CSDN博客專家]、[CSDN物聯(lián)網(wǎng)領(lǐng)域優(yōu)質(zhì)創(chuàng)作者]、[2021年度CSDN&RT-Thread技術(shù)社區(qū)之星]、[2022年RT-Thread全球技術(shù)大會(huì)講師]、[RT-Thread官方嵌入式開(kāi)源社區(qū)認(rèn)證專家]、[RT-Thread 2021年度論壇之星TOP4]、[華為云云享專家(嵌入式物聯(lián)網(wǎng)架構(gòu)設(shè)計(jì)師)]等榮譽(yù)。堅(jiān)信【知識(shí)改變命運(yùn),技術(shù)改變世界】!
審核編輯:湯梓紅
-
GCC
+關(guān)注
關(guān)注
0文章
107瀏覽量
24857 -
函數(shù)
+關(guān)注
關(guān)注
3文章
4341瀏覽量
62800 -
宏定義
+關(guān)注
關(guān)注
0文章
51瀏覽量
9042 -
RT-Thread
+關(guān)注
關(guān)注
31文章
1300瀏覽量
40264
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論