C語言中的 ,

2021-06-18 16:14:40 字數 1676 閱讀 3729

c語言中的#,##

今天在分析乙份原始碼的時候遇到了如下**:

#define uf_call(x)  (report(__file__,__line__,#x,(x)))

static int report (char* file, int line,char * call,int irc)

return (irc); }

網上參考:

[cpp]view plain

copy

print?

覺得其中的##很有意思,於是就將這個知識點整理一下。#和##都是預處理指令,我們先看#。

#用來把引數轉換成字串,請看下面的兩個例子。

注:#x  要在 #define中使用,否則會報錯。

例子一:讓標示符原樣輸出

例子二:也是原樣輸出,只是此處這就給的是乙個整形數,達到和上面不一樣的效果。

[cpp]view plain

copy

print?

#define sqr(x) printf("the square of x is %d.\n", ((x)*(x)));

如果這樣使用巨集:sqr(8);

則輸出為:the square of x is 64.

注意到沒有,引號中的字元x被當作普通文本來處理,而不是被當作乙個可以被替換的語言符號。

假如你確實希望在字串中包含巨集引數,那我們就可以使用「#」,它可以把語言符號轉化為字串。上面的例子改一改:

[cpp]view plain

copy

print?

#define sqr(x) printf("the square of "#x" is %d.\n", ((x)*(x)));

再使用:sqr(8);

則輸出的是:the square of 8 is 64.

和#運算子一樣,##運算子可以用於巨集函式的替換部分。這個運算子把兩個語言符號組合成單個語言符號。看例子:

[cpp]view plain

copy

print?

#define xname(n) x ## n

如果這樣使用巨集:xname(8)

則會被展開成這樣:x8

##就是個粘合劑,將前後兩部分粘合起來,也就是有「字元化」的意思。但是「##」不能隨意粘合任意字元,必須是合法的c語言標示符。在單一的巨集定義中,最多可以出現一次「#」或「##」預處理操作符。如果沒有指定與

「#」或「##」預處理操作符相關的計算次序,則會產生問題。為避免該問題,在單一的巨集定義中只能使用其中一種操作符(即,乙份「#」或乙個「##」,或都不用)。除非非常有必要,否則盡量不要使用「#」和「##」。

C語言中的

c語言中的 今天在分析乙份原始碼的時候遇到了如下 覺得其中的 很有意思,於是就將這個知識點整理一下。和 都是預處理指令,我們先看 用來把引數轉換成字串,請看下面的兩個例子。例子一 例子二 define sqr x printf the square of x is d.n x x 如果這樣使用巨集 ...

C語言中的 ,

用來把引數轉換成字串,請看下面的兩個例子。例子一 例子二 define sqr x printf the square of x is d.n x x 如果這樣使用巨集 sqr 8 則輸出為 the square of x is 64.注意到沒有,引號中的字元x被當作普通文本來處理,而不是被當作乙個...

C語言中的物件導向 C語言中的類模擬

在物件導向的語言裡面,出現了類的概念。這是程式設計思想的一種進化。所謂類 是對特定資料的特定操作的集合體。所以說類包含了兩個範疇 資料和操作。而c語言中的struct僅僅是資料的集合。li 1978 163.com 1 例項 下面先從乙個小例子看起 ifndef c class define c c...