亚洲综合图片区自拍_思思91精品国产综合在线观看_一区二区三区欧美_欧美黑人又粗又大_亚洲人成精品久久久久桥本

C語言如何獲取宏定義中函數(shù)的返回值

2023-08-25 16:08:06 來源:大川搬磚


【資料圖】

1. 前言

簡單的宏定義我們都會用,比如獲取較小值:

#define MIN(a, b)    ((a) < (b) ? (a) : (b))

但是,如果一個函數(shù)被封裝在了宏定義中,并且,還要宏定義之外 獲取這個函數(shù)的返回值,應(yīng)當(dāng)如何做呢?

2. 實現(xiàn)方法

有兩種實現(xiàn)方法:

在宏定義中使用在宏定義之外預(yù)先定義的變量;利用宏定義的特殊格式——({x; y; z;})。

2.1 “全局”變量

我們可以 預(yù)先定義一個變量,在宏定義函數(shù)中直接使用。

#include < stdio.h >#include < stdlib.h >#include < string.h >#include < stdint.h >#define MACRO_ADD(a, b) do {    sum = add(a, b); }while(0)staticint32_t add(int32_t a, int32_t b){    return a + b;}int main(int argc, char *argv[]){    int32_t sum = 0;    MACRO_ADD(1, 2);    printf("sum:%dn", sum);    return 0;}

這種方式最大的缺點就是 很不靈活,每次調(diào)用宏定義的時候都需要在宏定義之外定義一個固定類型,固定名稱的變量,就像上面代碼中的 int32_t sum = 0。所以,我 推薦使用下面的方法。

2.2 ()

#include < stdio.h >#include < stdlib.h >#include < stdint.h >#define MACRO_ADD_1(a, b) ({add(a, b);})#define MACRO_ADD_2(a, b) ({    int32_t _s = 0;     _s = add(a, b);     _s; })static int32_t add(int32_t a, int32_t b){    return a + b;}int main(int argc, char *argv[]){    int32_t sum = 0;    sum = MACRO_ADD_1(1, 2);    printf("sum 1:%dn", sum);    sum = 0;    sum = MACRO_ADD_2(1, 2);    printf("sum 2:%dn", sum);    return 0;}

這種方式就很完美了, 無需定義其余變量,直接調(diào)用宏定義即可。

2.2.1 語法說明

形如 #define xxx(a, b, c) ({x; y; z;})格式的宏定義,最終返回的是 z的執(zhí)行結(jié)果,z可以是一個函數(shù),也可以是一個變量,就像上面代碼中的 MACRO_ADD_1()MACRO_ADD_2();({x; y; z;})中, (、{、 })一個都不能少。

3. 其他

如果不確定被宏定義包裝后的函數(shù)是否被“翻譯”正確,可以生成預(yù)編譯文件來查看。

對于單文件來說,使用 gcc -E x.c -o x.c.i即可生成 x.c對應(yīng)的預(yù)編譯文件 x.c.i。比如,對于上面的代碼,預(yù)編譯文件中的 main()函數(shù)內(nèi)容如下:

如果工程的文件比較多的話,推薦使用[cmake:我這樣查看源碼的預(yù)編譯信息

4. 總結(jié)

Linux內(nèi)核源碼真有用。

標(biāo)簽:

上一篇:Linux shell函數(shù)簡介和使用方法
下一篇:最后一頁