gpt4 book ai didi

c++ - 如何拦截 C++ 代码中的 printf()?

转载 作者:行者123 更新时间:2023-11-30 02:45:30 28 4
gpt4 key购买 nike

我正在使用通过 printf() 生成标准输出的静态库。我如何拦截它以便在我的应用程序中显示输出并做一些突出显示?

我有 lib 的源代码,如果需要我可以稍微修改它。

最佳答案

I have the sources of the lib and i can modify it slightly if needed.

好吧,如果你真的确定他们正在使用 printf,并且你可以构建他们的代码,那么只要你没有其他地方可以使用它来对付他们使用 printf

(我假设是一个类 Unix 平台,因此可能需要进行一些修改才能使其在其他地方工作。)

您可以做的一件事是重新定义 printf 以指向您自己的版本。另一种是编写您自己的 printf 并将其链接到标准库之前。这些路线都不是您真正认为推荐的做法,尽管它们应该有效。两种途径都不需要修改库的源。

重新定义 printf

在这里,我们只是通过告诉编译器它实际上是一个不同的函数来混淆编译器的 printf 概念。将这样的内容添加到您的 Makefile 中:

CFLAGS += -Dprintf=redirected_printf
CXXFLAGS += -Dprintf=redirected_printf

(一些构建系统为此目的使用变量 DEFINES;YMMV。)

这告诉编译器将标识符 printf 的每个实例替换为 redirected_printf。这与将 #define printf redirected_printf 放在每个源文件的顶部是一样的。

现在您只需要编写redirected_printf 函数。我更喜欢将格式化传递给 stdio 中的另一个函数 vasprintf,它与 printf 做同样的事情,除了它需要一个 va_list 而不是... 并返回指向堆分配字符串的指针以及输出。

#include <stdarg.h>
#include <stdio.h>
extern "C" int redirected_printf(const char * format, ...) {
// Make formatted string.
char* outstr = 0;
va_list ap;
va_start(ap, format);
int result = vasprintf(&outstr, format, ap);
va_end(ap);
if(result < 0) // Error occurred and `outstr` undefined if result < 0.
return result;

// Do something with the string in `outstr` here, like display it in a dialog.

// Clean up and return.
free(outstr);
return result;
}

替换 printf

这有点棘手,因为你必须编写一个名为 printf 的函数,其工作方式类似于上面的 replacement_printf,然后你必须说服链接器链接到你的版本而不是标准库的。您也许可以将 printf 粘贴到您的编译单元之一中并完成它;当熟料将您重定向到源的库链接时,它将找到您的 printf 并链接到它;稍后当它在标准库中看到它时,它会丢弃它,因为那时没有任何东西调用它。

如果这不起作用,您可以尝试使用 arranlib 命令将您的 printf 放入您自己的库中,然后在您要重定向的库之后链接该库。

请注意,如果您尝试重定向的这个库是一个共享库(如 DLL 或 .so 文件),这可能不起作用;它在构建时链接到标准 printf

这条路线有更多的注意事项,并且取决于您的链接器的工作方式和许多其他因素,所以我不推荐它,但为了完整起见,我将其包含在此处。

关于c++ - 如何拦截 C++ 代码中的 printf()?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24378227/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com