如何在C ++中重载/覆盖printf,使其满足以下条件:
打印到STDOUT的每一行都预先附加或附加 我选择的人物。
对printf的调用并未模糊 - 即,我需要能够调用printf并修改每一行。一世 不要打电话给“myPrintf”或类似的东西。
背景
我正拼命地想要构建和查看使用* nix系统中的DXGI API的程序的标准文本输出。我在Windows系统上安装了SSH服务器,Jenkins和Jenkins CLI。
问题是Jenkins,当它给我构建的输出时,并没有以脚本方式标记我的程序的输出 - 也就是说,它与我的其他构建步骤的输出混淆,以及一般詹金斯的输出。
我希望能够以某种已知的字符集标记我的程序输出的每一行 - 这将允许我通过grep管道输出我的命令并获取我的程序的实际日志。通过保持printf调用不受骚扰,我也可以使用宏定义切换此调试输出。
修改
我愿意接受其他建议 - 以某种方式标记我的可执行文件的输出肯定也是一个选项,但它需要使用适用于 Windows 服务器的功能。
基本上,我已经到了可以在我的* nix机器上键入“make test”的地步,它将构建并给我(当前模糊的)测试输出,就好像它是本地的,但编译和执行是实际上远程发生。这非常棒 - 我的最后一步是去除测试输出。
答案 0 :(得分:1)
最方便的方式:
#include <stdio.h>
#include <stdarg.h>
using namespace std;
int taggedPrintf(const char * format, ...){
printf("[PRE]");
va_list args;
va_start (args, format);
vprintf (format, args);
va_end (args);
printf("[POST]\n");
}
#define printf taggedPrintf
int main()
{
printf("your usual message");
printf("Testing numbers %d %f", 1,0.2);
return 0;
}
另一种方式:(快速) 您可以尝试定义缩写:
#define PRE printf("[PREFIX]");
#define POST printf("[SUFFIX]\n");
int main()
{
PRE
printf("your usual message");
POST
return 0;
}
另一种方法: 将stdout重定向到null设备以阻止屏幕输出
freopen("/dev/null", "a", stdout);
定义一个大字符串缓冲区
char largeBuffer[LARGE_ENOUGH];
使用setbuf将所有内容发送到此缓冲区
setbuf(stdout, largeBuffer);
.....
(Use printf as usual.)
.....
最后,您需要将标记附加并添加到每行或整个输出,并取消重定向,最后打印标记的流。