【发布时间】:2013-05-05 07:55:37
【问题描述】:
我正在使用 XC8 编译器。为此,您必须定义自己的 void putch(char data) 函数才能使 printf() 之类的函数正常工作,如 here 所述。基本上,putch() 是用于向stdout 写入字符的函数。
我现在想即时更改此功能。我有两个不同的函数,putch_a() 和 putch_b(),并且希望能够即时更改用于 putch() 本身的函数。
我想到了这个:
unsigned use_a_not_b;
void putch(char data) {
if (use_a_not_b) {
putch_a(data);
} else {
putch_b(data);
}
}
但是,这会降低执行速度。有没有办法为此使用指针?我已阅读this answer,并编写了以下代码:
void putch_a(char data);
void putch_b(char data);
void (*putch)(char) = putch_a; // to switch to putch_a
void (*putch)(char) = putch_b; // to switch to putch_b
这行得通吗?有没有更快或更实用的方法?
【问题讨论】:
-
它可能甚至无法编译。
-
一个 if...else 和一个调用/返回真的会显着降低 i/o 函数的执行速度吗?与检查缓冲区空间是否空闲、计算缓冲区偏移量、通知硬件数据可用、在数据实际传输到硬件时被中断等所有时间相比。你的第一个块应该没问题。
-
@ThePhoton 您适合这种情况,但如果您想选择更多功能怎么办?这就是我认为应该有另一种选择来做到这一点的方式。
-
如果 putch_a 和 putch_b 是可内联的,这甚至不需要额外的调用/返回。对于更多情况,您可以有一个整数
which_putch和一个 case 语句……编译器会很好地优化它们。如果您想获得花哨的@undefinedbehavior 的解决方案也可以,但确实需要额外的电话/退货。 -
@ThePhoton 当然取决于您要使用多少不同的功能。对于少量,switch 语句可能确实是最快的。对于更大的金额(我没有测试过有多大),答案会更快。
标签: c function pointers function-pointers stdout