1. 程式人生 > >變參(不定參)的巨集函式

變參(不定參)的巨集函式

1.可變的巨集是具有不定引數的巨集。這些引數用...代表,被儲存到__VA_ARGS__中。他會在內部進行擴充套件。

#defien err(...) fprintf(stderr, __AV_ARGS__)
err("%s file total %dMB.\n", "hello.c", 2) ;
預處理後為: fprintf(stderr, %s file total %dMB.\n", "hello.c",2) ;
2.可變的巨集可以包含命名引數(在...之前)如:
#define errout(a, b, ...) fprintf(stderr, "file %s |%d|\n",a,b); fprintf(stderr,__VA_ARGS__)

3.很多時候我們在呼叫程式出錯時都需要輸出帶file帶line的log。我們可能會這樣寫
if(err) fputs(stderr, %s file:|%d|: %s\n", __FILE__, __LINE__, error message) ;
但是我們發現輸出錯誤所在的檔案和行時都要寫這兩個巨集變數很麻煩。我們需要的時自動把file和line加到錯誤資訊中。那麼我們用不定引數巨集加一些小技巧搞定。
#define errout(...) _errout(__FILE__, __LINE__, __VA_ARGS__)

#define _errout(file, line, ...) fprintf(stderr, "File %s:|%d| \n", file, line) ;\
    fprintf(stderr, __VA_ARGS__) 
這樣只需寫入錯誤資訊,file和line就會“自動”輸出出來。

注意1 fmt... 必須帶...要不然就不能給dbg傳遞不定引數, 編譯器會認為巨集dbg()是定引數的,
//2dbg()的定義不能帶... 原因很簡單你會在printf()最後加...嗎?

#define dbg(log_level, fmt...) kickstart(log_level, _FUNCTION, _LINE, fmt)
void
kickstart(int log_level, const char *func_name, int line_number, const char *format, ...)
{
        ;


dbg(x, y, z, q, 1, 3 ,4) ;

說明:
對編譯器有要求,c99支援,g++不支援,
參考文章:http://www.jeffhung.net/blog/articles/jeffhung/1013/

相關推薦

不定巨集函式

1.可變的巨集是具有不定引數的巨集。這些引數用...代表,被儲存到__VA_ARGS__中。他會在內部進行擴充套件。 #defien err(...) fprintf(stderr, __AV_

Flutter路由的跳轉、動畫與傳最簡單

跳轉 命名路由 在檔案構建時先設定路由引數: new MaterialApp( // 程式碼 routes: { "secondPage":(BuildContext context)=>new SecondPage(), }, ); 在需要做路由跳轉的時候直接使用: Na

抽象類&&介面做形其實同理

抽象類:傳入該抽象類的子類物件 eg: package javaBasic; public class TestAbstract { public static void main(String[] args) { FreshLad fl = new FreshLad()

jmeter實現跨執行緒傳token傳遞

1、寫入登入介面,後置處理器--正則表示式提取token 2、設定全域性變數:新增--Sampler--Bean Shell Sampler;輸入指令碼函式:${__setProperty(Token,${token},)} 備註:${__setProperty(Token,

SVM調機器學習

import numpy as np import matplotlib.pyplot as plt from scipy import stats # use seaborn plotting defaults import seaborn as sns; sns.set

使用Java、hibernate validator註解校驗入,格式化出

在專案執行真正業務程式碼前,一般都需要對於前端的入參值進行一輪的判斷,而一般的做法是寫if語句進行值的判斷,如下例子 public boolean insertOneUser(String name, int age) { if (name == null || n

python獲得變數的名稱,獲得傳和實的名稱

1.需求和例子 需求:獲得變數的名稱 實現例子: aaa = '23asa' bbb = 'kjljl2' loc = locals() def get_variable_name(variable): print loc for key

VUE中父子元件傳簡單明瞭

· 父元件向子元件傳遞引數 child.vue如下 <template> <div class="childClass"> <h3>子元件內容</h3> <p :class

設置JDK環境linux版

登錄 eclipse .org class pan XML 目錄 必須 set 設置環境變量一、修改/etc/profile文件當本機僅僅作為開發使用時推薦使用這種方法,因為此種配置時所有用戶的shell都有權使用這些環境變量,可能會給系統帶來安全性問題。用文本編輯器打開

tensorflow中的共享sharing variables

圖像濾波 ted div 復雜 模型 當我 管理 重構 har 為什麽要使用共享變量? 當訓練復雜模型時,可能經常需要共享大量的變量。例如,使用測試集來測試已訓練好的模型性能表現時,需要共享已訓練好模型的變量,如全連接層的權值。 而且我們還會遇到以下問題: 比如,我們創建了

P和P1指向了O和O1兩個對象的地址, 而不是O和O1的內容(對象的實際地址)——充分證明@是取對象的地址,而不是量裏面的內容,夠清楚!

com 告訴 cnblogs src logs es2017 strong bsp html 如圖,為什麽這樣取出來的p,p1的值不一樣呢? 165232328群友庾偉洪告訴我: P和P1指向了O和O1兩個變量(對象)的地址, 而不是O和O1的內容(對象

Shell編程之詳解

export oca shel overruns 當我 nbsp 正則表達式 通過 onf 一、什麽是變量 在我們上學時,我們就接觸數據方程式;例如:已知x=1 y=x+1 那麽y等於多少,我們毫不猶豫的會算出來2,但是在shell中x就是變量名,那麽對應的1就是變量值,在

JMeter學習十六JMeter函式學習

JMeter函式是一些能夠轉化在測試樹中取樣器或者其他配置元件的域的特殊值。一個函式的呼叫就像這樣:${_functionName(var1,var2,var3)},-functionName匹配函式名,圓括號內設定函式的引數,例如${_time(YMD)}實際引數因函式而不同。不需要引數的函式使圓

c語言基礎-整型

可用 我們 固定 字節數 有符號 borde 輸入 c語言 長整型 一、整型變量 類型 關鍵字 取值範圍 存儲單元字節數(非固定) 輸出 有符號整型 [signed] int -2147483648~2147483647 4 %d 無符號整型 unsign

JavaScript高階程式設計讀書筆記函式表示式

定義函式的方式有兩種:一種是函式宣告,另一種就是函式表示式。 函式宣告的一個重要特徵就是函式宣告提升(function declaration hoisting),意思是在執行程式碼前會先讀取函式宣告。 這個例子不會報錯,因為程式碼在執行前會先讀取函式宣告。理解函式提升的關鍵就是區別函式宣告和函式表示式之

GoLang學習筆記十二匿名函式及回撥用法

Go語言支援匿名函式,即在需要使用函式時,再定義函式。 匿名函式沒有函式名,只有函式體,函式可以被作為一種型別被賦值給變數,匿名函式也往往以變數的方式被傳遞。 匿名函式經常被用於實現回撥函式、閉包等。 定義格式: func(引數列表)(返回引數列表){    //函式體 }

面向物件建立物件--建構函式模式02

上一篇工廠模式中有一個例子 現在建立自定義的建構函式,從而定義自定義物件型別的屬性和方法。例如,可以使用建構函式模式將上面的例子重寫如下  function Person(name, age, job) { this.name = name; this

十 四Python 函式

     函式是組織好的,可重複使用的,用來實現單一,或相關聯功能的程式碼段。函式能提高應用的模組性,和程式碼的重複利用率。 我們已經知道Python提供了許多內建函式,比如print()。但我們也可以自己建立函式,這被叫做使用者自定義函式。 定義

Python 筆記 不定更新

剛開始學習python, 做下筆記。 os.walk()方法 os.walk() 方法用於通過在目錄樹中游走輸出在目錄中的檔名,向上或者向下。 os.walk() 方法是一個簡單易用的檔案、目錄遍歷器,

寫迴圈體的技巧-----迴圈不loop invariant

迴圈不變式是一種條件式(必須滿足的條件,對迴圈而言是保持不變的,無論迴圈執行了多少次),迴圈語句沒執行一次,就要求中間的結果必須符合不變式的要求。(1)進入迴圈語句時,不變式必須成立;(2)迴圈語句的迴圈體不能破壞不變式。也就是說,迴圈體開始迴圈時不變式成立,結束時也必須成立