我們在寫c語言程式中,已經初步了解到了#define的用法,下面對#define做乙個詳細的用法說明。
格式如下:
#define name stuff
有了這條指令之後,每當有name出現,就會被預處理器替換為stuff。
例:
#define reg register
#define do_forever for(;;)
#define case break;case
如果定義中的stuff比較長,可以使用續行符分成幾部分,如:
#define debug_print printf("file %s line %d:"\
"x=%d,y=%d,z=%d,\
__file__,__line__,\
x,y,z)
這裡需要強調,在#define定義的識別符號常量後不要加分號,這樣做在某些狀況下不會出錯,但在大多數情況下容易出錯,並且不好看出,所以不建議在巨集定義之後加分號。
定義:#define機制包括了乙個規定,允許把引數替換到文字中,這種實現通常稱為巨集。
#define name(parameter-list) stuff
其中,引數列表的左括號必須與name緊鄰,如果兩者之間有任何空白存在,引數列表就會被解釋為stuff的一部分。
舉例說明:
#define square(x) x*x
a=5;
printf("%d\n",square(a+1));
乍一看,可能會覺得列印36這個值,事實上,會列印11這個值。
再次強調,巨集替換只是簡單的文字替換,所以實際上在程式中,被替換成了,a+1*a+1,怎麼計算相信大家都會。
想要解決這個問題非常容易,在寫巨集時,盡可能多的帶括號,比如寫成下面的形式,
#define square(x) ((x)*(x))
總結:所有用於對數值表示式進行求值的巨集定義都應該用這種方式加上括號,避免在使用巨集時,由於引數中的操作符或鄰近的操作符之間不可預料的相互作用。
在程式中擴充套件#define定義符號和巨集時,需要涉及以下幾個部分:
#define print(format,value) \
printf("the value is "format"\n",value)
...print("%d",x+3);
實際上替換後就是:printf(「the value is %d\n」,x+3);
這種技巧只有當字串常量作為巨集引數給出時才能使用。
第二個技巧使用預處理器把乙個巨集引數轉換為乙個字串。
例:
#define add_to_sum(sum_number,value) \
sum##sum_number+=value
.....
add_to_sum(5,25);
替換後即:
sum5+=25;注意這種連線必須產生乙個合法的識別符號,否則,其結果就是未定義的。
€當巨集引數在巨集定義中出現的次數超過一次時,如果這個引數具有***,那麼當你使用這個巨集時,就是不安全的,會導致不可預料的錯誤。***就是 在表示式求值時出現的永久性效果。
例如:
x+1;//不帶***
x++;//帶有***
以乙個max巨集函式具體說明:
#define max(a, b) ( (a) > (b) ? (a) : (b) )
...
x = 5;
y = 8;
z = max( x++, y++);
printf("x=%d y=%d z=%d\n", x, y, z);
//輸出的結果是什麼?
直接給出替換後的**:
z=(
(x++) > (y++
)?(x+
+):(y
++));
這樣就能得出結果了吧
x=6;
y=10;
z=9;
實際上,巨集於函式的用法在某些情況寫是非常不容易區分的,所以我們需要通過命名方式從外表來區分巨集與函式。
巨集名全部大寫
函式名不要全部大寫
#define
max(a,b) ((a)>(b)?(a):(b))
max(a,b);
用摘自《c和指標》書中的乙個**來區分巨集與函式。
關於C語言中的巨集
define pi 3.14 define zhouchang r 2 pi r 定義帶引數的巨集 undef pi 結束巨集 使用 ifdef ifndef else endif執行條件編譯 ifdefine 巨集名稱 語句 else 語句 endif define age 39 int main...
關於C語言中的巨集
巨集 macro,是一種批量處理的稱謂。巨集是一種規則或模式,或稱語法替換。在預編譯時進行,稱作巨集展開。c語言中的巨集定義 1 define是預處理器處理的單元實體之一 2 define定義的巨集可以出現在程式的任意位置 3 define定義之後的 都可以使用這個巨集。定義巨集常量 1 可以直接使...
C語言中的巨集
c語言中如何使用巨集c 和c 中的巨集 macro 屬於編譯器預處理的範疇,屬於編譯期概念 而非執行期概念 下面對常遇到的巨集的使用問題做了簡單總結。在c語言的巨集中,的功能是將其後面的巨集引數進行字串化操作 stringfication 簡單說就是在對它所引用的巨集變數通過替換後在其左右各加上乙個...