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