gpt4 book ai didi

c - 如何在运行时在 C 中重新定义打印函数

转载 作者:太空宇宙 更新时间:2023-11-04 01:02:13 25 4
gpt4 key购买 nike

我目前正在使用一个简单的预处理器开关来禁用/启用我的调试语句。我将 printf 重定向到 UART 输出,然后在全局包含的 header (globals.h) 中定义我的打印函数,以便像这样轻松禁用所有调试:

#ifdef USE_UART
#define MY_PRINT(...) printf(__VA_ARGS__)
#else
#define MY_PRINT(...)
#endif

然后我的所有应用程序文件都可以像这样通过 UART 打印调试消息:

MY_PRINT("\t<<Battery Voltage: %d>>\r\n", vBat);

我想做的是在运行时通过外部输入(即按下按钮)切换它。例如这样的事情:

void my_print(const char * pString){
if (uart_mode == UART_ON){
printf(pString);
}
}

uart_mode 可以通过外部输入切换。我无法弄清楚如何通过此函数将变量参数正确传递到 printf 中。这可能吗?有更好的方法吗?

最佳答案

在运行时避免条件(虽然它仍然是动态调度)并精确模拟函数调用(因为它是一个函数调用)的一个体面的方法是:

typedef int (*printf_func_t)(const char *, ...);

int dummy_printf(const char *format, ...) {
return 0;
}

/* Set initial value based on initial uart_mode */
printf_func_t dynamic_printf = uart_mode == UART_ON ? &printf : &dummy_printf;

在其他一些切换代码中(uart_mode 已更改),您只需测试并重新分配:

dynamic_printf = uart_mode == UART_ON ? &printf : &dummy_printf;

然后实际用户总是调用 dynamic_printf 代替 printf,它调用当前分配给函数指针的函数。打印时不会读取或测试 uart_mode,它只会调用当时找到的任何函数。

关于c - 如何在运行时在 C 中重新定义打印函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34029394/

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