2009-06-17 69 views
1

從我理解的斷言是C中的一個宏,據推測,如果你在編譯時使用它,但將其禁用,那麼不會有開銷(這可能是不正確的,我不知道)。 我的問題是,我想要做的就是讓所有的變量傳遞給我的函數,並打印出來的輸出,但只有當我想調試啓用。以下是我迄今爲止:有比在C中使用#ifdef更簡單的方法嗎?

int exampleFunction (int a, int b) 
{ 
    #ifdef debugmode 
    printf("a = %i, b = %i", a, b); 
    #endif 
} 

我不知道是否有做這樣的事情變得更容易(和更少的醜陋)方法。 xdebug for php具有此功能,我發現在調試時爲我節省了大量時間,所以我想爲每個功能都做到這一點。

感謝

+1

斷言()宏被禁用完全是在NDEBUG被定義的情況下,所以如果在釋放模式下定義的話,將不會有開銷。 – 2009-06-17 19:17:56

回答

11

試試這個:

#ifdef debugmode 
#define DEBUG(cmd) cmd 
#else 
#define DEBUG(cmd) 
#endif 


DEBUG(printf("a = %i, b = %i", a, b)); 

現在,如果你有debugmode定義,你讓你的打印語句。否則,它從不出現在二進制文件中。

+0

可悲的是,你留下了一個無用的函數調用,但我爲了減少一個純粹主義者而鬥爭+1。 – Kai 2009-06-17 18:57:37

+0

+1我的選擇,以及 – Tom 2009-06-17 18:58:03

+0

嗯這給我留下的編譯器錯誤: 'B」未申報(第一次使用此功能) 不知道爲什麼 – 2009-06-17 19:01:14

0

可以定義爲PRINTF_IF_DEBUGGING

#ifndef NDEBUG 
#define PRINTF_IF_DEBUGGING(X) printf(X) 
#else 
#define PRINTF_IF_DEBUGGING(X) 
#endif 

這將集中在中的#ifdefs只有一個地方。

1
if (MY_DEBUG_DEFINE) { 
     do_debug_stuff(); 
} 

任何一半體面的編譯器會優化塊。請注意,您需要將MY_DEBUG_DEFINE定義爲布爾值(即0或不爲0)。

#define MY_DEBUG_DEFINE defined(NDEBUG) 

如果你碰巧有最大警告級別進行編譯,這一招避免未引用的論據

3

使用GCC,我真的很喜歡來添加,每個文件:

#if 0 
#define TRACE(pattern,args...) fprintf(stderr,"%s:%s/%u" pattern "\n",__FILE__,__FUNCTION__,__LINE__,##args) 
#else 
#define TRACE(dummy,args...) 
#endif 

,然後在代碼:

i++; 
TRACE("i=%d",i); 

i會,當我激活在TRACE()宏只能打印文件的頂部。工作真的很棒,再加上它打印源文件,線路和它發生的功能。

0

那麼,這裏給出的PRINT_DEBUG類型宏的問題是它們只允許一個參數。對於一個正確的printf()我們需要幾個,但C宏不(現在)允許可變參數。

因此,爲了解決這個問題,我們必須發揮創意。

#ifdef debugmode 
    #define PRINTF printf 
#else 
    #define PRINTF 1 ? NULL : printf 
#endif 

然後,當你寫PRINTF("a = %i, b = %i", a, b);,在非調試模式下,它會呈現爲(有效):

if (true) NULL; 
else printf("a = %i, b = %i", a, b); 

編譯器是幸福的,但printf的是從來沒有執行,如果編譯器如果明亮(即任何現代C編譯器),則printf()的代碼永遠不會生成,因爲編譯器將識別該路徑永遠不會被採用。

但是請注意,該參數將仍然被評估,因此,如果它們有任何副作用(即,++ x或函數調用)時,它們的代碼可以生成(但不執行)

1

解決方法獲取與預處理程序變量參數不支持它

#define DEBUG 

#ifdef DEBUG 
#define trace(args) printf args 
#else 
#define trace(args) 
#endif 


int dostuff(int value) 
{ 


    trace(("%d", value)); 

} 
0

我也會打印一些其他的C預處理器標誌,可以幫助你跟蹤問題下來

printf("%s:%d {a=%i, b=%i}\n", __FILE__, __LINE__, a, b); 
相關問題