在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

【GCC編譯優(yōu)化系列】宏定義名稱與函數(shù)同名是一種什么騷操作?

嵌入式物聯(lián)網(wǎng)開(kāi)發(fā) ? 來(lái)源:嵌入式物聯(lián)網(wǎng)開(kāi)發(fā) ? 作者:嵌入式物聯(lián)網(wǎng)開(kāi)發(fā) ? 2022-12-08 08:43 ? 次閱讀

【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)題描述

如下圖所示:

image-20221205011209795

**因?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ù)改變世界】!

審核編輯:湯梓紅

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • GCC
    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
收藏 人收藏

    評(píng)論

    相關(guān)推薦

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

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

    一種解決函數(shù)優(yōu)化問(wèn)題的免疫算法

    一種解決函數(shù)優(yōu)化問(wèn)題的免疫算法:介紹了免疫算法的基本概念,以及人工免疫系統(tǒng)中的克隆選擇原理,基于該原理,結(jié)合遺傳策略中的高斯變異算子,提出一種免疫算法來(lái)解決
    發(fā)表于 11-08 16:47 ?14次下載

    內(nèi)聯(lián)函數(shù)定義的區(qū)別介紹

    定義是C語(yǔ)言提供的三預(yù)處理功能的其中一種,這三預(yù)處理包括:
    發(fā)表于 12-15 15:33 ?2347次閱讀
    內(nèi)聯(lián)<b class='flag-5'>函數(shù)</b>和<b class='flag-5'>宏</b><b class='flag-5'>定義</b>的區(qū)別介紹

    不帶參數(shù)的定義是什么?不帶參數(shù)的定義的資料介紹詳細(xì)過(guò)程概述

    c語(yǔ)言中有個(gè)定義,其中有類就是不帶參數(shù)的定義
    發(fā)表于 09-04 15:38 ?5次下載

    GCC編譯優(yōu)化指南

    在控制。當(dāng)然理論上控制編譯工具行為的還應(yīng)當(dāng)有 AS ASFLAGS ARFLAGS 等變量,但是實(shí)踐中基本上沒(méi)有軟件包使用它們。  那么我們?nèi)绾慰刂七@些變量呢?一種簡(jiǎn)易的做法是首先設(shè)置與這些
    發(fā)表于 04-02 14:36 ?555次閱讀

    編譯優(yōu)化對(duì)函數(shù)的影響

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

    剖析verilog2005的操作之對(duì)數(shù)函數(shù)

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

    如何讓gcc編譯中斷函數(shù)

    ),此時(shí)cpu會(huì)向棧中壓入堆寄存器來(lái)保護(hù)現(xiàn)場(chǎng),如果是異常,還會(huì)多壓個(gè)錯(cuò)誤代碼,因此編寫中斷函數(shù)返回時(shí)要使用"iret"指令,但是gcc默認(rèn)是無(wú)法
    發(fā)表于 11-26 11:06 ?7次下載
    如何讓<b class='flag-5'>gcc</b><b class='flag-5'>編譯</b>中斷<b class='flag-5'>函數(shù)</b>

    C語(yǔ)言定義與預(yù)處理、函數(shù)函數(shù)庫(kù)

    系統(tǒng)平臺(tái)上的gcc)前言本篇文章將會(huì)向大家介紹下C語(yǔ)言的預(yù)處理知識(shí)、定義函數(shù)、以及編譯執(zhí)行
    發(fā)表于 12-07 21:06 ?2次下載
    C語(yǔ)言<b class='flag-5'>宏</b><b class='flag-5'>定義</b>與預(yù)處理、<b class='flag-5'>函數(shù)</b>和<b class='flag-5'>函數(shù)</b>庫(kù)

    gcc編譯優(yōu)化系列】如何(不)回收未發(fā)生調(diào)用的函數(shù)

    的bin文件大小勢(shì)必會(huì)增加,這顯然不是我們想要的。 另外,還有一種場(chǎng)景下,有些函數(shù)我們使用static修飾的局部函數(shù),只在初始化的時(shí)候通過(guò)初始化列表的形式調(diào)用下,比如RT-Threa
    的頭像 發(fā)表于 07-11 09:12 ?2987次閱讀

    GCC編譯優(yōu)化系列】實(shí)戰(zhàn)分析C代碼遇到的編譯問(wèn)題及解決思路

    GCC編譯優(yōu)化系列】實(shí)戰(zhàn)分析C工程代碼可能遇到的編譯問(wèn)題及其解決思路
    的頭像 發(fā)表于 07-10 23:15 ?1459次閱讀
    【<b class='flag-5'>GCC</b><b class='flag-5'>編譯</b><b class='flag-5'>優(yōu)化</b><b class='flag-5'>系列</b>】實(shí)戰(zhàn)分析C代碼遇到的<b class='flag-5'>編譯</b>問(wèn)題及解決思路

    GCC編譯優(yōu)化系列】multiple-definition

    GCC編譯優(yōu)化系列】這種讓人看不懂的multiple-definition真的有點(diǎn)讓人頭疼
    的頭像 發(fā)表于 07-11 09:26 ?7299次閱讀
    【<b class='flag-5'>GCC</b><b class='flag-5'>編譯</b><b class='flag-5'>優(yōu)化</b><b class='flag-5'>系列</b>】multiple-definition

    GCC編譯優(yōu)化系列】-specs=kernel.specs

    GCC編譯優(yōu)化系列GCC編譯鏈接時(shí)候--specs=kernel.specs鏈接屬性究竟是個(gè)
    的頭像 發(fā)表于 07-11 09:25 ?3534次閱讀
    【<b class='flag-5'>GCC</b><b class='flag-5'>編譯</b><b class='flag-5'>優(yōu)化</b><b class='flag-5'>系列</b>】-specs=kernel.specs

    Linux使用gcc編譯程序的語(yǔ)法

    01. 調(diào)試相關(guān)的 在Linux使用gcc編譯程序的時(shí)候,對(duì)于調(diào)試的語(yǔ)句還具有些特殊的語(yǔ)法。 gcc
    的頭像 發(fā)表于 06-22 10:51 ?725次閱讀

    C語(yǔ)言中函數(shù)定義和用法

    函數(shù)一種特殊的函數(shù),與普通函數(shù)不同的是,它可
    發(fā)表于 10-11 11:32 ?3653次閱讀
    C語(yǔ)言中<b class='flag-5'>宏</b><b class='flag-5'>函數(shù)</b>的<b class='flag-5'>定義</b>和用法
    主站蜘蛛池模板: 国产特黄一级片| 好男人社区在线观看www| 成人网在线观看| 亚洲啊v| 欧美色人阁| 欧美操穴视频| 男男生子大肚play做到生| 一级aaa毛片| 四只虎免费永久观看| 亚洲 欧美 另类 吹潮| 特级中国aaa毛片| 日本成人黄色网址| 色偷偷91久久综合噜噜噜| 日日噜噜夜夜狠狠va视频| 天堂中文字幕在线| 一个色在线视频| 四虎在线电影| 免费看特级淫片日本| 欧美洲视频在线观看| 久久亚洲成人| 美女黄页网站免费进入| 国模吧在线视频| 国久久| 亚洲色图22p| 黄色网久久| 91大神精品在线观看| xxx久久| 一级特黄特黄xxx视频| 国产男女免费视频| 天堂69亚洲精品中文字幕| 美女视频一区| 一本大道香蕉大vr在线吗视频| 国产精品日韩欧美亚洲另类| 国产一级片免费| 天天夜天天干| 亚洲小便| 丁香激情小说| 亚洲一区二区三区网站| 欧美一区二区视频三区| 五月婷婷激情网| 视色4se成人午夜精品|