色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美15最新在线-色哟哟免费在线观看-国产l精品国产亚洲区在线观看-国产l精品国产亚洲区久久

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

【GCC編譯優化系列】宏定義名稱與函數同名是一種什么騷操作?

嵌入式物聯網開發 ? 來源:嵌入式物聯網開發 ? 作者:嵌入式物聯網開發 ? 2022-12-08 08:43 ? 次閱讀

【GCC編譯優化系列】宏定義名稱與函數同名是一種什么騷操作?

如果說宏定義時C語言的精髓,那么當你看到這樣的宏定義代碼的時候,你一定會感慨,什么時候把這個精髓敲掉,我不要了!

1 寫在前面2 問題描述3 問題分析4 問題總結5 更多分享

1 寫在前面

有一天,在逛RT-Thread技術論壇時,看到這么一個問題,說某份代碼中,宏定義的名稱竟然與函數同名。怎么回事?

你可以去參考下原貼是怎么說的:

RT-Thread-條件編譯的宏和函數名一樣是否不妥RT-Thread問答社區 - RT-Thread

2 問題描述

如下圖所示:

image-20221205011209795

**因為這個同學的代碼編譯不過,所以他就提出了這樣的疑問:**究竟在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
    GCC
    +關注

    關注

    0

    文章

    107

    瀏覽量

    24856
  • 函數
    +關注

    關注

    3

    文章

    4338

    瀏覽量

    62752
  • 宏定義
    +關注

    關注

    0

    文章

    51

    瀏覽量

    9037
  • RT-Thread
    +關注

    關注

    31

    文章

    1296

    瀏覽量

    40238
收藏 人收藏

    評論

    相關推薦

    GCC編譯優化系列】前后編譯的兩版本固件bin大小不樣?

    GCC編譯優化系列】前后編譯的兩個版本固件bin大小不樣,怎么辦?
    的頭像 發表于 09-09 09:01 ?4788次閱讀
    【<b class='flag-5'>GCC</b><b class='flag-5'>編譯</b><b class='flag-5'>優化</b><b class='flag-5'>系列</b>】前后<b class='flag-5'>編譯</b>的兩版本固件bin大小不<b class='flag-5'>一</b>樣?

    一種解決函數優化問題的免疫算法

    一種解決函數優化問題的免疫算法:介紹了免疫算法的基本概念,以及人工免疫系統中的克隆選擇原理,基于該原理,結合遺傳策略中的高斯變異算子,提出一種免疫算法來解決
    發表于 11-08 16:47 ?14次下載

    內聯函數定義的區別介紹

    定義是C語言提供的三預處理功能的其中一種,這三預處理包括:
    發表于 12-15 15:33 ?2342次閱讀
    內聯<b class='flag-5'>函數</b>和<b class='flag-5'>宏</b><b class='flag-5'>定義</b>的區別介紹

    不帶參數的定義是什么?不帶參數的定義的資料介紹詳細過程概述

    c語言中有定義,其中有類就是不帶參數的定義
    發表于 09-04 15:38 ?5次下載

    GCC編譯優化指南

    在控制。當然理論上控制編譯工具行為的還應當有 AS ASFLAGS ARFLAGS 等變量,但是實踐中基本上沒有軟件包使用它們。  那么我們如何控制這些變量呢?一種簡易的做法是首先設置與這些
    發表于 04-02 14:36 ?553次閱讀

    編譯優化函數的影響

    編譯器如gcc,可以指定不同的優化參數,在某些條件下,有些函數可能會被優化掉。
    的頭像 發表于 06-22 14:58 ?2849次閱讀
    <b class='flag-5'>編譯</b>器<b class='flag-5'>優化</b>對<b class='flag-5'>函數</b>的影響

    剖析verilog2005的操作之對數函數

    也是支持的,我試了2017.4及以后的版本都可以支持,放心用。 ***友情提示:所有支持verilog2005標準的編譯器都可以用這個函數,所以使用之前確定編譯器是否支持這個標準,還有考慮好后期可移植性的影響 這個是可
    的頭像 發表于 10-09 15:29 ?4450次閱讀
    剖析verilog2005的<b class='flag-5'>騷</b><b class='flag-5'>操作</b>之對數<b class='flag-5'>函數</b>

    如何讓gcc編譯中斷函數

    ),此時cpu會向棧中壓入堆寄存器來保護現場,如果是異常,還會多壓個錯誤代碼,因此編寫中斷函數返回時要使用"iret"指令,但是gcc默認是無法
    發表于 11-26 11:06 ?7次下載
    如何讓<b class='flag-5'>gcc</b><b class='flag-5'>編譯</b>中斷<b class='flag-5'>函數</b>

    C語言定義與預處理、函數函數

    系統平臺上的gcc)前言本篇文章將會向大家介紹下C語言的預處理知識、定義函數、以及編譯執行
    發表于 12-07 21:06 ?2次下載
    C語言<b class='flag-5'>宏</b><b class='flag-5'>定義</b>與預處理、<b class='flag-5'>函數</b>和<b class='flag-5'>函數</b>庫

    gcc編譯優化系列】如何(不)回收未發生調用的函數

    的bin文件大小勢必會增加,這顯然不是我們想要的。 另外,還有一種場景下,有些函數我們使用static修飾的局部函數,只在初始化的時候通過初始化列表的形式調用下,比如RT-Threa
    的頭像 發表于 07-11 09:12 ?2970次閱讀

    GCC編譯優化系列】實戰分析C代碼遇到的編譯問題及解決思路

    GCC編譯優化系列】實戰分析C工程代碼可能遇到的編譯問題及其解決思路
    的頭像 發表于 07-10 23:15 ?1449次閱讀
    【<b class='flag-5'>GCC</b><b class='flag-5'>編譯</b><b class='flag-5'>優化</b><b class='flag-5'>系列</b>】實戰分析C代碼遇到的<b class='flag-5'>編譯</b>問題及解決思路

    GCC編譯優化系列】multiple-definition

    GCC編譯優化系列】這種讓人看不懂的multiple-definition真的有點讓人頭疼
    的頭像 發表于 07-11 09:26 ?7252次閱讀
    【<b class='flag-5'>GCC</b><b class='flag-5'>編譯</b><b class='flag-5'>優化</b><b class='flag-5'>系列</b>】multiple-definition

    GCC編譯優化系列】-specs=kernel.specs

    GCC編譯優化系列GCC編譯鏈接時候--specs=kernel.specs鏈接屬性究竟是個
    的頭像 發表于 07-11 09:25 ?3504次閱讀
    【<b class='flag-5'>GCC</b><b class='flag-5'>編譯</b><b class='flag-5'>優化</b><b class='flag-5'>系列</b>】-specs=kernel.specs

    Linux使用gcc編譯程序的語法

    01. 調試相關的 在Linux使用gcc編譯程序的時候,對于調試的語句還具有些特殊的語法。 gcc
    的頭像 發表于 06-22 10:51 ?719次閱讀

    C語言中函數定義和用法

    函數一種特殊的函數,與普通函數不同的是,它可
    發表于 10-11 11:32 ?3629次閱讀
    C語言中<b class='flag-5'>宏</b><b class='flag-5'>函數</b>的<b class='flag-5'>定義</b>和用法
    主站蜘蛛池模板: 亚洲精品m在线观看| 99无人区码一码二码三| 国产精品久久久久精品A片软件| 色偷偷7777www| 国产精品亚洲专区在线播放| 亚洲人成电影网站色2017| 快播苍井空| yy8090理论三级在线看| 无码日本亚洲一区久久精品| 久久精品国产免费| 被送到黑人性奴俱乐部| 亚洲精品成人无码A片在线| 免费a视频在线观看| 国产高清视频免费在线观看| 约艺术院校96年清纯白嫩| 人成片在线观看亚洲无遮拦| 国产综合自拍 偷拍在线| 97午夜伦伦电影理论片| 文中字幕一区二区三区视频播放 | 理论片午午伦夜理片久久| 成电影人免费网站| 一个色夫导航| 色呦呦人人视频| 久青草影院| 国产精品亚洲精品影院| 91久久夜色精品| 亚洲高清视频免费| 秋霞电影网午夜鲁丝片无码| 精品国产免费第一区二区| 成人精品视频在线观看| 在线观看国产日韩| 贤妻良母电影日本| 飘雪在线观看免费高清完整版韩国 | 日本一本在线播放| 久久久久久免费高清电影| 国产成人在线播放| PORN白嫩内射合集| 最近2019年日本中文免费字幕| 午夜伦理在线观看| 日本工口生肉全彩大全| 麻豆婷婷狠狠色18禁久久|