【GCC編譯優化系列】宏定義名稱與函數同名是一種什么騷操作?
如果說宏定義時C語言的精髓,那么當你看到這樣的宏定義代碼的時候,你一定會感慨,什么時候把這個精髓敲掉,我不要了!
1 寫在前面2 問題描述3 問題分析4 問題總結5 更多分享
1 寫在前面
有一天,在逛RT-Thread的技術論壇時,看到這么一個問題,說某份代碼中,宏定義的名稱竟然與函數同名。怎么回事?
你可以去參考下原貼是怎么說的:
RT-Thread-條件編譯的宏和函數名一樣是否不妥RT-Thread問答社區 - RT-Thread
2 問題描述
如下圖所示:
**因為這個同學的代碼編譯不過,所以他就提出了這樣的疑問:**究竟在C語言中宏定義名稱能不能與函數名同名?
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)
查看一下預處理后的代碼長啥樣:
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 注釋掉,編譯沒有問題,因為預處理后的代碼長這樣:
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 }
**通過上面的代碼分析,以及預處理后的文件的對比,我們可以發現,宏定義的名稱與函數同名,本身并沒有問題;但是如果宏定義對應的函數名,沒有被定義,但代碼的上下文又調用了這個函數(宏),那么編譯上肯定是會報錯的,因為 **找不到這個函數 !
4 問題總結
- 先不考慮寫代碼的規范性,如果單從語法上考慮,看看預處理后的文件有助于幫助排查問題;
- 在C語言的教科書中,并沒有提到宏定義的名字不能與函數同名;所以這個根本就不是語法規則的限制;
- 代碼是首先是給人讀的,其次才是給機器運行的;所以我個人是不太推薦這種過于隱晦的寫法;可讀性將大打折扣;
- 如果在代碼協作中看到這樣的代碼,我認為應該毫不猶豫地指正這個問題,同時要求修正這樣的代碼。
5 更多分享
[架構師李肯]
架構師李肯 ( 全網同名 ),一個專注于嵌入式IoT領域的架構師。有著近10年的嵌入式一線開發經驗,深耕IoT領域多年,熟知IoT領域的業務發展,深度掌握IoT領域的相關技術棧,包括但不限于主流RTOS內核的實現及其移植、硬件驅動移植開發、網絡通訊協議開發、編譯構建原理及其實現、底層匯編及編譯原理、編譯優化及代碼重構、主流IoT云平臺的對接、嵌入式IoT系統的架構設計等等。擁有多項IoT領域的發明專利,熱衷于技術分享,有多年撰寫技術博客的經驗積累,連續多月獲得RT-Thread官方技術社區原創技術博文優秀獎,榮獲[CSDN博客專家]、[CSDN物聯網領域優質創作者]、[2021年度CSDN&RT-Thread技術社區之星]、[2022年RT-Thread全球技術大會講師]、[RT-Thread官方嵌入式開源社區認證專家]、[RT-Thread 2021年度論壇之星TOP4]、[華為云云享專家(嵌入式物聯網架構設計師)]等榮譽。堅信【知識改變命運,技術改變世界】!
審核編輯:湯梓紅
-
GCC
+關注
關注
0文章
107瀏覽量
24856 -
函數
+關注
關注
3文章
4338瀏覽量
62752 -
宏定義
+關注
關注
0文章
51瀏覽量
9037 -
RT-Thread
+關注
關注
31文章
1296瀏覽量
40238
發布評論請先 登錄
相關推薦
評論