C檔案中debug函式及巨集中 的使用

2021-08-16 14:13:45 字數 953 閱讀 6291

1.redis-3.0\src\redis.h

#define redisdebug(fmt, ...) \

printf("debug %s:%d > " fmt "\n", __file__, __line__, __va_args__)

#define redisdebugmark() \

printf("-- mark %s:%d --\n", __file__, __line__)

2.

#ifdef debug

#define printf(fmt, args...) printf(fmt, ##args)

#else

#define printf(fmt, args...)

3.

#define debug(format, args...) fprintf(stderr, format, ##args)
#define debug(format, args...) fprintf(stderr, format, args)
使用:macro.c

#include #define debug(format, args...) fprintf(stderr, format, args)

int main(void)

gcc編譯上述**,編譯結果如下:

說明:如果使用args,而不是##args,debug巨集不接受debug("world\n");這種沒有可變引數的呼叫。

在網上搜這種情況下##的作用,有一種解釋是:這裡的##起到把前面多餘的","去掉的作用

C 中內聯函式與巨集

c 內聯函式 inline 介紹 介紹內聯函式之前,有必要介紹一下預處理巨集。內聯函式的功能和預處理巨集的功能相似。相信大家都用過預處理巨集,我們會經常定義一些巨集,如 define table comp x x 0?x 0 define table comp x x 0?x 0 就定義了乙個巨集。...

巨集和c 中的inline內聯函式

inline函式是c 引入的機制,目的是解決使用巨集定義的一些缺點。1.為什麼要引入內聯函式 內聯函式的作用 用它替代巨集定義,消除巨集定義的缺點。巨集定義使用預處理器實現,做一些簡單的字元替換因此不能進行引數有效性的檢測。另外它的返回值 不能被強制轉換為可轉換的合適 型別,且c 中引入了類及類的訪...

C函式和巨集中的可變引數

一 呼叫慣例 函式的呼叫方和被呼叫方對函式如何呼叫應該有統一的理解,否則函式就無法正確呼叫。比如foo int n,int m 呼叫方如果認為壓棧順序是m,n,而foo認為壓棧順序是n,m,那麼這個函式就不會呼叫成功。因此,函式的呼叫方和被呼叫方對於函式如何呼叫需要有個明確的約定,雙方都遵守同樣的約...