一招讓你徹底掌握C語言中運用巨集以及 與 的妙用

2021-10-04 19:53:33 字數 3269 閱讀 8520

學習c語言,特別是閱讀linux原始碼的時候,大家經常遇到很多的巨集定義,有簡單的,當然也有很複雜的。

有事乙個巨集定義甚至有幾十行之多,遇到這種巨集定義的大家基本上是一臉懵逼,不知所措,其實想複雜的巨集定義沒有去深究的價值,簡短的才有深究的價值。

但是你不理解這些長的巨集定義就無法接著理解接下來的**,今天這裡就叫大家乙個我經常使用的方法,來理解些巨集定義,將你需要理解的巨集定義,新建乙個.c檔案,比如test.c,這時僅需要使用gcc -e test.c > test,執行之後test就是test.c展開之後的檔案,也就是預處理之後的檔案,裡面的巨集都會進行展開

我這裡舉例兩個巨集定義,並趁機說明下#和##的作用

#  將對應標緻按照字面意思轉換我對應的字元

## 黏貼兩個標緻為乙個

#include

#include

#include

//nan

//#的作用是將關鍵字轉換為對應的字元

#define peval(cmd) printf(#cmd ": %g\n", cmd);

#define setup_list(name, ...) \

double *name ## _list = (double ); \

int name ## _len = 0; \

for (name ## _len =0; \

!isnan(name ## _list[name ## _len]); \

) name ## _len ++;

intmain()

;double list=

;peval

(sizeof

(plist)/(

sizeof

(double)+

0.0));

peval

(sizeof

(list)/(

sizeof

(double)+

0.0));

// 測試雙 ##

setup_list

(items,1,

2,4,

8);double sum=0;

for(

double

*ptr= items_list;

!isnan

(*ptr)

; ptr++

) sum +

=*ptr;

printf

("total for items list: %g\n"

, sum)

;#define length(in) in ## _len

sum=0;

setup_list

(next_set,-1

,2.2

,4.8

,0.1);

for(

int i=

0; i <

length

(next_set)

; i++

) sum +

= next_set_list[i]

;printf

("total for next set list: %g\n"

, sum)

;}

展開後的部分**

int

main()

;double list=

;//#的作用是將關鍵字轉換為對應的字元

#define peval(cmd) printf(#cmd ": %g\n", cmd);

//peval(sizeof(plist)/(sizeof(double)+0.0));

//展開後,可以看到,所有peval 裡面填寫的標誌已經經過#cmd 被轉換為字串

printf

("sizeof(plist)/(sizeof(double)+0.0)"

": %g\n"

,sizeof

(plist)/(

sizeof

(double)+

0.0));

;printf

("sizeof(list)/(sizeof(double)+0.0)"

": %g\n"

,sizeof

(list)/(

sizeof

(double)+

0.0));

;#define setup_list(name, ...) \

double *name ## _list = (double ); \

int name ## _len = 0; \

for (name ## _len =0; \

!isnan(name ## _list[name ## _len]); \

) name ## _len ++;

//雙 ## 將兩個標緻會黏貼到一塊

double

*items_list =

(double

);int items_len =0;

for(items_len =0;

! __builtin_isnan (

items_list[items_len]);

) items_len ++;;

double sum=0;

for(

double

*ptr= items_list;

! __builtin_isnan (

*ptr

); ptr++

) sum +

=*ptr;

printf

("total for items list: %g\n"

, sum)

; sum=0;

double

*next_set_list =

(double

);int next_set_len =0;

for(next_set_len =0;

! __builtin_isnan (

next_set_list[next_set_len]);

) next_set_len ++;;

for(

int i=

0; i < next_set_len; i++

) sum +

= next_set_list[i]

;printf

("total for next set list: %g\n"

, sum)

;}

一招讓你變得有邏輯!(速看)

為什麼我做事總是沒有條理啊?沒有條理,沒有邏輯的做事情,事情總是越做越多。事情越做越多,就會越來越亂。不是你不夠聰明,而是沒有思考的方法和套路。怎樣可以讓自己變得更有邏輯呢?今天就教你如何快速變得有邏輯。為什麼會沒有邏輯呢?一般是兩個原因。一是不願意動腦筋,想的太少。另乙個是腦筋動的多,但是沒有體系...

一招讓你的PCB逼格登月

這是乙個比較花裡胡哨的功能,或者說一般都有專門的美工負責這部分的工作,那這個功能到底是什麼呢?就是使用軟體對產品的外觀設計進行渲染,比如比較常用的keyshot軟體。一般來說是產品是有外殼的,這樣進行渲染一波,可以達到非常逼真的效果,方便裝b 下面是我之前體驗kicad畫的一塊pcb,在3d檢視下可...

大象裝企營銷 一招讓你的客戶到店量翻一倍

本文僅適用於裝修 建材公司,其它行業請舉一反三。營銷目前依然是家居建材行業主流營銷獲客手段。如何讓 邀約變得更加有效?近幾年,在建材家居行業,面對日趨加大的競爭壓力,終端營銷渠道的拓展和營銷技術的提公升越來越被大家所關注。因為成本低 易複製 對操作環境依賴小等優勢,營銷已成為眾多公司首當其衝的選擇方...