2011-12-20 71 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++)