转载--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)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: (转载)你好,C++(19)“老师,我这
- 下一篇: 新网络导航