2011-12-20 28 views
1

宏我有一個宏這樣的printf在用C

#define PTF(A,y) fprintf(file,"%s",A,y);printf("%s %d",A,y); 

,使其打印到文件和控制檯 因此,例如,我把這種微距功能

int y=9; 
PTF("\nRound %d \n",y); 

在某種程度上我需要將y = 9顯示爲參數A的一部分,因此我的文件中的fprintf將如下所示

Round 9 

因爲我有一個很大的變化,使我是否要改變這一點,因此希望一個簡單的方法=)

+1

那麼......問題是什麼? – tangrs 2011-12-20 08:28:48

+0

在fprintf函數中,它將打印爲「Round%d」。所以我想知道是否有任何方法來識別y顯示在fprintf – edelweiss 2011-12-20 08:31:02

+0

這與你的問題是相切的,但想想如果有人打電話給你的宏會發生什麼情況:'if(cond)PTF( 「%d」,y);',其中'cond'是一些條件(它並不重要)。 – NPE 2011-12-20 08:36:57

回答

1

變化

#define PTF(A,y) fprintf(file,"%s",A,y);printf("%s %d",A,y);

#define PTF(A,y) fprintf(file,A,y);printf("%s %d",A,y);

注:

PTF("Round %d",9);將fprint寫入Round 9到文件但printf仍然會顯示Round %d 9

你也必須確保你只給出一個說明符fprintf中

+0

謝謝!它以我想要的方式工作! =) – edelweiss 2011-12-20 16:29:06

0

如果」重新使用Unix(BSD/Linux/Solaris等),也許這更容易使用tee

+0

如果在執行程序期間'file'必須改變,該怎麼辦?我沒有看到'tee'作爲解決方案。問題在於如何編寫宏,而不是如何分割輸出。 – 2011-12-20 13:11:05

+0

我說「也許」。當我們編寫代碼而不是使用已經存在的代碼時,有很多情況。 – ern0 2011-12-20 14:42:14

4

宏是錯誤的方法來做到這一點;特別是在這種結構中,你會遇到大約每一個宏觀陷阱。試想一下:

if(condition) 
    PTF("%s", foo); 

簡單地寫一個可變參數函數:

void 
ptf(char *fmt, ...) 
{ 
    va_list ap; 
    va_start(ap, fmt); 
    vprintf(fmt, ap); 
    va_end(ap); 
    va_start(ap, fmt); 
    vfprintf(file, fmt, ap); 
    va_end(ap); 
} 
0

常見的成語是使用do { ... } while (0)(一些編譯器會生成此警告)或逗號操作,和括在括號您的發言(但是你不能使用和控制流量表)。

如果您可以依賴現代編譯器(例如GCC 3+),則可以使用可變宏來定義宏,以便與常規printf類似。

我會去是這樣的:

#define PTF(...) (fprintf(file,__VA_ARGS__),printf(__VA_ARGS__)) 

使PTF("Round %d",y)將打印Round 9(假設Y = 9)上都filestdout

對宏的副作用通常的警告適用:從不,永遠不會使用PTF("%d",y++)