巨集的本質以及巨集(包括函式式巨集) 沒有返回值概念

2021-09-11 06:37:03 字數 2046 閱讀 9301

由什麼問題而引申的:

字串「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 語言中允許用乙個識別符號來表示乙個字串,稱為巨集,該字串可以是常數 表示式 格式串等。在編譯預處理時,對程式中所有出現的 巨集名 都用巨集定義中的字串去代換,這稱為 巨集代換 或 巨集展開 巨集定義是由源程式中的巨集定義命令完成的。巨集代換是由預處理程式自動完成的...