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