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