keil中使用 變引數巨集 VA ARGS

2022-02-04 09:01:17 字數 956 閱讀 2838

本文說的__va_args__,就是乙個可變引數巨集,與printf中可變引數的巨集定義乙個道理,是新c99規範中增加的。

__va_args__詳情內容

__va_args__它是乙個可變引數的巨集,就是將左邊巨集中「...」 的內容原樣抄寫在右邊 __va_args__ 所在的位置。

要注意的是,printf 的輸出格式是括號內左邊是字串,右邊是變數,而且右變數與左輸出格式是一一對應的,不對應就會出錯。可以參看下面那個例子, __va_args__其實是遵循了printf的格式。

...預設號代表乙個可以變化的參數列。使用保留名 __va_args__ 把引數傳遞給巨集。當巨集的呼叫展開時,實際的引數就傳遞給 printf()了。

2.例項說明

#define sensor_printf(...)  printf("--sensor--"__va_args__)

inttemperatureval = 25;

sensor_printf("溫度 = %d℃\n", temperatureval);

輸出結果:

--sensor--溫度 = 25℃

用心的朋友可能會猜測的到:「...」類似等於「__va_args__」。

從例子中我們可以看得出來,__va_args__的用途,主要是用於可變引數的函式。我們使用較多的printf就是最常見的乙個。

如果我們的工程很龐大,我們就可以將列印資訊分類,這樣的好處就是方便我們識別各類列印資訊。

我自己在專案中使用的方法如下:

#define _msg_dbg(...)   segger_rtt_printf(0, __va_args__);      //rtt列印

如果不想列印,就使用下面的:

#define _msg_dbg(...) 

即可參考了strongerhuang 的部落格

c語言的變參使用 可變引數巨集 標準預定義巨集

gcc的預處理提供的可變引數巨集定義真是好用 ifdef debug define dbgprint format,args.fprintf stderr,format,args else define dbgprint format,args.endif 如此定義之後,中就可以用dbgprint了...

malloc 函式在keil中使用應注意什麼

在keil 中使用malloc 函式經常會遇到不正常的情況,通常表現為不能正確分配記憶體 空間,或者只能分配很小的空間。出現這個問題的原因大概有三個 1 所用的arm 晶元本身記憶體已經被其 占用,所餘空間不夠malloc分配。解決辦法 a 釋放其他 浪費的ram空間 b 擴容。2 未進行堆的初始化...

巨集定義中引數使用

1.巨集傳遞變長引數 最近用c語言寫乙個程式,經常呼叫shell或者其他命令,中多處出現如下 char script cmd cmd max len 1 memset script cmd,0,sizeof script cmd sprintf script cmd,cmd s s param1,p...