巨集定義中的一些問題

2021-08-08 07:17:34 字數 1326 閱讀 3624

c99中規定巨集可以像函式一樣帶有可變引數,比如

#define log(format, ...) fprintf(stdout, format, __va_args__)

其中,...表示引數可變,__va_args__在預處理中為實際的引數集所替換

gcc中同時支援如下的形式

#define log(format, args...) fprintf(stdout, format, args)

其用法和上面的基本一致,只是引數符號有變化

有一點需要注意,上述的巨集定義不能省略可變引數,儘管你可以傳遞乙個空引數,這裡有必要提到"##"連線符號的用法。

"##"的作用是對token進行連線,在上例中,format、__va_args__、args即是token,

"#"後面直接跟引數,相當於將引數外部加了乙個雙引號「」,

巨集定義中使用do while()可以避免warning,如果出現在判斷後的巨集,可以保證作為乙個整體去實現。杜絕了多加乙個分號的情況發生在**引入時候

如果token為空,那麼不進行連線,所以允許省略可變引數(__va_args__和args),對上述變參巨集做如下修改

#define log(format, ...)     fprintf(stdout, format, ##__va_args__)
#define log(format, args...) fprintf(stdout, format, ##args)
/*

* va_list.cpp

* * created on: 2023年9月15日

* author: guojing

*/#include#includeusing namespace std;

#define max(a,b) a>b?a:b //普通帶參巨集定義

//除錯時輸出除錯資訊,正式發布時則不輸出,在除錯環境下,log巨集是乙個變參輸出巨集,以自定義的格式輸出;在發布環境下,log巨集是乙個空巨集,不做任何事情。

#ifndef debug

#define log(fmt,...) \

do \

while(0) \//可變帶參巨集定義, ...表示引數可變,__va_args__在預處理中為實際的引數集所替換

#else

#define judge_return(condition, return) \

if (!(condition))\

#endif

int main()

{ int x=100,y=200;

int max=max(x,y);

cout<

關於指標定義的一些問題

關於const在定義常量方面的使用問題 在學習的c c 的過程中,會時常會碰到一些令人大費腦筋拐不過彎來的事情 比如這個const的使用。當我看到和int const a,const int a,const int const a const int a,int const a的 時候,頭都大了,一...

繼承中的一些問題

1.本質 達到 復用,子類可以復用父類的方法和屬性 2.繼承關係中構造方法的呼叫關係 子類的任何乙個構造方法,總是會呼叫父類中的某乙個構造方法 預設情況下,呼叫父類無參構造方法 可以使用super關鍵字,在子類構造方法中的第一行呼叫 父類指定的構造方法 3.方法覆蓋 重寫 覆蓋了父類的方法 要求 同...

Word中的一些問題

在做畢業 時,有一些人在用word的分隔符時常常遇到問題,在這裡我給大家說一下,用分隔符的目的是為了區分各個部分頁面的不同而出現的。有分隔符和分欄符之分。如果你大學還沒有畢業,還沒有開始寫畢業 那麼這個你一定要學會,因為畢業 是有他自己的格式的,老師會要求你用那種頁首 那種頁尾 那種頁碼,要求是很嚴...