日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

转载--c语言宏定义(1)

發布時間:2024/4/17 编程问答 42 豆豆
生活随笔 收集整理的這篇文章主要介紹了 转载--c语言宏定义(1) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

作者:獨舞風

鏈接:c語言宏定義(1)

1、為什么要有宏定義?

? ? ? ? 代碼中某個特定數值需要參與運算,而且該數值作用于多個地方,當需要對該數值進行修改時,希望只改動一個地方就能實現該數值的全部更新;即便某個數值只用到一次,當修改時也會面臨搜索閱讀大量代碼、數值含義不明晰的問題;某些“操作塊”封裝成函數時,調用函數開銷(保存上下文環境、參數調用、堆棧分配等)太大影響效率,不封裝則需要多次輸入相同的“操作塊”內容,并且修改麻煩容易出現不一致的問題,這時就需要把“操作塊”定義成宏,該方案本質是“空間換時間”。

? ? ? ? 總之,宏的出現時為了:提供代碼可讀性、增加代碼書寫效率和提高系統運行效率。

2、宏的產生背景是什么?

? ? ? ? 宏的本質就是“無條件替換”,而且宏只對程序的文本起作用,它眼中的世界只有文本(字符),沒有邏輯運算。記得學習C時,老師告我們:“每條語句后邊都要加分號“;”,但是宏定義不能加“,問原因竟然是:”就是不能,記住就行!“。現在知道原因了:如果加了分號,分號就成為了宏定義的一部分,在進行”宏展開“時直接截斷語句,當然會出問題。

? ? ? ? 確切的說, 程序源代碼(*.c文件)是不能被計算機直接執行的,編譯器需要對程序代碼進行“一系列處理”,轉換成計算機能讀懂的二進制文件(*.bin)。這涉及到編譯原理的知識了(如果有機會,我會就編譯原理進行講解),一系列處理包括:預處理(Preprocessing)、編譯(Compilation)、匯編(Assembly)、鏈接(Linking)?!昂暾归_”過程就發生在“預處理”階段,編譯器負責用實際數據替換掉宏名,所以經過了“預處理”,函數代碼中就已經沒有所謂宏的概念了。

下面我將做個試驗,進行驗證:

(1)在Fedora環境下,鍵入“vi test_macro.c”輸入下面的代碼并保存

(2)退出vi環境,鍵入“gcc -E test_macro.c”執行,效果如下

(3)試驗結果分析:

? ? ? ? "gcc -E test_macro.c" 命令就是告訴編譯器只對代碼進行預處理,不再進行后續工作直接輸出。可以看到,我們定義的宏PI和R都已經不存在了,而且都被替換成了它們各自的常量值。main函數上面的那些函數聲明,是stdio.h文件的展開,預處理階段不只進行了宏展開,還對包含的頭文件進行了展開,這里不再細說。

?

? ? ?下一節,我們將結合試驗數據,對宏使用過程中的一些注意事項進行分析。

?

轉載于:https://www.cnblogs.com/flyingdirt/p/4214158.html

總結

以上是生活随笔為你收集整理的转载--c语言宏定义(1)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。