日本免费高清视频-国产福利视频导航-黄色在线播放国产-天天操天天操天天操天天操|www.shdianci.com

學無先后,達者為師

網站首頁 編程語言 正文

C語言宏定義容易認不清的盲區梳理_C 語言

作者:編程小魚六六六 ? 更新時間: 2022-11-10 編程語言

1、概念

#define命令是C語言中的一個宏定義命令,它用來將一個標識符定義為一個字符串,該標識符被稱為宏名,被定義的字符串稱為替換文本。

命令有兩種格式:一種是簡單的宏定義,另一種是帶參數的宏定義。

(1)簡單的宏定義:

#define<宏名> <字符串>

#defineVALUE((sizeof(a))/sizeof(a[0]))

(2) 帶參數的宏定義

#define<宏名> (<參數表>)<宏體>

#defineMAX(a,b)((a)>(b)?(a):(b))

2、不能忽略宏定義中的空格

下面的宏定義中f是否帶了參數呢?

#definef(x)((x)+1)

答案是否定的,在f與(x)之間存在一個空格,導致變成了如下定義。

#define f (x)((x)+1)

預處理程序對它不作任何檢查。如有錯誤,只能在編譯已被宏展開后的源程序時發現。

3、宏不是函數

如果我們定義一個宏:

#defineMAX(a,b)a>b?a:b

當我們執行一個語句:

3+MAX(1,3);

我們期望的答案應該是6才對,其實呢,運行之后的答案1。與宏定義相掛鉤的就是優先級,算數運算符的優先級高于條件運算符,展開如下。

3+1>3?1:3,首先進行算符運算符的運算,即4>3?1:3,所以答案為1。

請注意宏定義中的括號,這些括號的作用就是預防引起優先級相關的問題。有些專家建議在C語言中只要牢記兩個優先級就夠了,乘除法優先級高于加減法,在設計其它操作符時,一律加上括號。

4、宏定義不是說明或語句

在行末不必加分號,如加上分號則連分號也一起置換

5、宏不是類型定義

首先定義一個宏

#definepCharchar*

再用pChar 定義兩個變量,之后用操作符sizeof讀取變量所占用內存大小,如果是指針類型的就占4個字節,如果是字符型的就占1個字節。

結果占用空間不一樣,變量類型自然不一樣,所以宏定義不是類型定義。那如果我換成typedef來定義類型呢?

宏定義只是簡單的字符串代換,是在預處理完成的,而typedef是在編譯時處理的,它不是作簡單的代換,而是對類型說明符重新命名。被命名的標識符具有類型定義說明。

6、與之相關的宏定義

編寫程序過程中,很多都需要條件編譯,來看一個常用的使用方法。

#if defined(CREDIT)
    credit();
#elif defined(DEBIT)
    debit();
#else
    printerror();
#endif

7、總結

宏的本質是代碼替換。

原文鏈接:https://blog.csdn.net/yx5666/article/details/126891289

欄目分類
最近更新