2012-04-19 68 views
0

在我的C++代碼中有幾個fprintf語句,我用它來進行調試。由於我可能再次需要它們,所以暫時不要評論它們。但是,我需要程序的執行速度很快,所以我想避免將它們打印出來,就像它們暫時(我將stderr重定向到一個文件)一樣。是否可以執行程序skip fprintf-statements /如何創建自己的fprintf-function?

main (int argc, char *argv[]) 
{ 
int isPrint=0; 
if (argc > 1) { 
     isPrint = atoi (argv[2]); 
} 

} 

我想重命名fprintf中的另一名稱,然後從該函數做fprintf中:

優選地,這將通過使參數傳遞給程序,這是我將提取這樣的用戶來確定-call使用相同的參數,基於的值isPrint;然而,然後我意識到fprintf可以有很多不同類型的論據和各種論點;而且我不知道用這些要求來宣佈我自己的功能的任何通用方法。

所以我想知道如何創建一個函數,其功能完全像fprintf,但它需要額外的參數isPrint;或者如何以另一種方式解決上述問題。之後的第一篇文章

補充信息: 一個解決辦法是給每個fprintf中語句前加上這一句:

if (isPrint == true) 
+0

你有沒有想過爲此目的使用宏? – PlasmaHH 2012-04-19 12:55:51

+2

你的更大的問題是,看起來你的整個程序實際上是由C組成的,從我可以告訴的。 – Puppy 2012-04-19 12:55:56

回答

1

首先注意的是,如果這只是爲了調試,我同意典型的方法是使用宏或預處理器定義來告訴編譯器包含日誌記錄或不。但是,如果您不希望它完全由編譯器刪除(以便可以使用參數打開或關閉打印),則可以編寫自己的日誌函數,其中需要isPrint和一些字符串,然後在調用它之前使用snprintf()來格式化字符串。

東西沿着這些路線:

void myLog(int isPrint, char *message) 
{ 
    if(isPrint == 1) 
    { 
     fprintf(logFile, "%s", message); 
    } 
} 

char msg[64]; 
snprintf(msg, 64, "Test Message %d", 10); 
myLog(isPrint, msg); 

它也有可能在自己的varags功能包fprintf(),但是這將是更爲複雜。

5

的典型方法是使用預處理程序的調用編譯客場fprintf()

你會做這樣的事情:

#if defined DEBUG 
#define LOG(a) fprintf a 
#else 
#define LOG(a) 
#endif 

並在代碼你會做:

LOG(("The value is %f", some_variable)); 

注意雙括號,這只是爲了讓語法的工作。你可以做得更好,但這更容易解釋。現在

,你要麼只是在文件的頂部編輯代碼#define#undefDEBUG預處理符號,或通過合適的選項編譯器(-D對於GCC)。

+0

雙括號不起作用。這將導致'fprintf((「的值爲%f」,some_variable))',這是逗號運算符的應用程序,並會丟棄第一個值。 – interjay 2012-04-19 12:59:47

+0

您鏈接的答案沒有在'printf'之後放置圓括號。 – interjay 2012-04-19 13:07:22

+0

@interjay Doh,未能正確閱讀我自己的代碼。當然那些'()'不應該在那裏,修正並且謝謝! – unwind 2012-04-19 13:37:40

1

爲了調試目的,你可以使用可變參數宏:

#ifdef DEBUG 
#define FPRINTF(...) fprintf(__VA_ARGS__) 
#else 
#define FPRINTF(...) 
#endif 

留心的是,如果你使用fprintf,而不是直接FPRINTF則因爲要定義的庫函數,它應當是#include<>後出現功能。

0

這取決於您在更改代碼方面有多大的靈活性,以及​​您是否希望能夠在運行時關閉此功能或僅編譯時間。

我建議你把它包裝在你自己的可變參數函數中(對於技巧look here),然後你已經封裝了這個功能。

您的函數本質上只是一個簡單的包裝器fprintf(),但此時您可以使用預處理器確保您的日誌記錄函數在編譯時不會執行任何操作,也可以使用「 ,這是運行時的日誌記錄級別,因此只有在調試級別足夠高時纔會調用底層fprintf()

相關問題