由什麼問題而引申的:
字串「xx\\enm\\usb」中的xx是會變的,想寫乙個巨集定義來表示該字串。首先,想到用#define str(x) x"\\enm\\usb」形式,發現不行而引申出下文第一點。接著,想巨集定義是否有返回值來表示而引申出下文第二點。最後,想到用#define str(x)
strcat(x,"\\enm\\usb」)形式(這裡,巨集仍然只是源**文字替換,並不是說明巨集有返回值,有返回值是因為strcat函式有返回值而已),因為strcat函式的結果值就是連線後的字串變數x。
一、#define命令是c語言中的乙個巨集定義命令,它用來將乙個識別符號定義為乙個字串,該識別符號被稱為巨集名,被定義的字串稱為替換文字:
#define 《巨集名》 《字串》
這裡說的 《字串》 指的是源**檔案(級別)上的文字替換(即修改些源**),不是指源**檔案裡的字串變數或是字串常量的值的變化替換。例如,
#define str(x) x「\\you」
char *psz="love";
char strl[20]=;
則strcpy(strl,str(psz));並不是替換成:strcpy(strl,"love"「\\you」);
而是替換成:strcpy(strl,psz「\\you」);
注釋:fprintf(stderr, "warning" "divider == 0" "\n");
strcpy(str,"love"「\\you」);
但是strcpy(strl,psz「\\you」);是不行的。
c/c++編譯器支援自動將多個字串常量連線成乙個新字串常量,而各個字串常量之間不用使用字串連線符(c/c++語言中貌似沒有字串連線符或說字串連線操作符,資料庫中有的,如||)。若是要連線的字串**現的是有字串變數(包括const char型別),則c/c++編譯器不支援自動將它們連線成乙個新字串常量。
附加參考:
為什麼 c 語言中可以將字串字面量寫成"hello " "world" " ! "; 這種形式?
中間沒有任何操作符,直接就將幾個字串連線在一起了,這為什麼是對的啊?
二、巨集(包括函式式巨集) 沒有返回值的概念,函式才有返回值的概念
函式才有返回值的概念,因為呼叫函式時有乙個切換並保護現場的過程,所以切換回來(到呼叫者)時就需要通過返回值將函式的結果傳送回來。
巨集(包括函式式巨集) 沒有返回值的概念,因為它只是在源**檔案(級別)上的文字替換(即修改些源**),沒有乙個切換並保護現場的過程,所以不需要也不存在乙個通過返回值將其的結果傳送回來的過程。還有,巨集所代表的表示式的計算結果是叫乙個結果值,不叫(函式)返回值。例如,
#define a(a,b,c) ()
#include
int main()
執行結果:
1,2,3,6
其中,巨集函式 a(a,b,c)有返回值,即最後乙個式子的返回值作為巨集函式的返回值。巨集函式 a(a,b,c)所代表的
整體表示式()或說有乙個結果值,即最後乙個式子a+b+c的結果值作為巨集函式所代表的整體表示式的結果值。
注釋:1、#define ***() {} ,是標準c支援的,
也是gcc新增的功能(微軟vs不支援),主要為了防止巨集展開出現問題,預設展開時是要加上乙個;的(即),(否則)容易出問題。
2、表示式是操作符、變數、常量的任意組合。在c語言中,花括號{}和分號;(分號是表示式語句(結束的)分隔符,不算運算子。)不是操作符,而圓括號()和逗號,(屬於順序點運算子)是操作符(即運算子)。而上述d=這個整體表示式(即乙個賦值表示式)中可以作為其子表示式,有點費解。上述語句裡,花括號{}和分號;相當於圓括號()和逗號,的作用。
3、整體表示式
《子表示式》,《子表示式》;《子表示式》,《子表示式》;《子表示式》,《子表示式》;
表示式分隔符,比表示式分隔符;優先順序高
4、標頭檔案的內容除了函式原型和巨集定義外,還可以有結構體定義,全域性變數定義
參考:利用巨集 得到多個值 谷歌
參考:c語言之#define用法(巨集定義命令)
c語言巨集定義總結
巨集定義函式返回值 谷歌
附加:
C語言巨集中 和 的用法以及巨集展開規則
之前也看過一些c語言巨集的使用,特別是對 t 以及 text 巨集的實現也比較感興趣,但是之前對 t,text巨集的實現也是一知半解,沒有徹底搞明白,週末在寫另外一篇部落格 時恰好又用到了巨集,所以想好好把這塊學習整理下。的作用是把乙個token 標記 變成乙個字串,也就是使用 把token包含起來...
CONTAINING RECORD巨集函式的用途
函式原型 define containing record address,type,field type pchar address ulong ptr type 0 field 引數 address 指向type型別結構例項中某域 成員 的指標 field type型別結構包含的域 成員 的名稱...
函式式巨集定義與普通函式
函式式巨集定義與普通函式 在 及c 語言中允許用乙個識別符號來表示乙個字串,稱為巨集,該字串可以是常數 表示式 格式串等。在編譯預處理時,對程式中所有出現的 巨集名 都用巨集定義中的字串去代換,這稱為 巨集代換 或 巨集展開 巨集定義是由源程式中的巨集定義命令完成的。巨集代換是由預處理程式自動完成的...