typedef int(*EventHandler_Proc_t)(int a, int b); // A function-pointer to be called to handle an event
struct
{
Event_t event_id;
EventHandler_Proc_t proc;
} EventTable[] = { // An array of Events, and Functions to be called when the event occurs
{ EventInitialize, InitializeFunction },
{ EventIncrement, IncrementFunction },
{ EventNOP, NothingFunction }, // Empty function is used here.
};
实际上,在 C 语言中,吞噬参数并且不返回任何值的函数是普遍存在的,但是并没有显式地写出来,因为几乎每一行都隐式地调用了它。在传统 C 语言中,这个空函数最常见的用法是对任何语句的值进行不可见的丢弃。但是,由于 C89,这可以明确拼写为 (void)。每当函数返回值被忽略而没有显式地传递给这个不返回任何值的内置函数时,lint工具就会发出抱怨。这背后的动机是为了防止程序员无声无息地忽略错误条件,您仍然会遇到一些使用编码风格 (void)printf("hello, world!\n");的旧程序。
这种功能可用于:
回调(其他回答已经提到了)
高阶函数的一个参数
对框架进行基准测试,无需执行无操作的开销
具有可以比较其他函数指针的正确类型的唯一值。(特别是在像 C 这样的语言中,所有的函数指针都是可转换的,并且可以彼此比较,但是函数指针和其他类型的指针之间的转换是不可移植的。)
无为函数的另一个临时用途可以是存在一行来放置断点,例如,当您需要检查传递到新创建的函数中的运行时值时,这样您就可以更好地决定将要放入的代码需要访问哪些内容。就个人而言,我喜欢使用自我分配,也就是说,当我需要这种断点时,使用 i = i,但是一个 no-op 函数可能也同样适用。
void MyBrandNewSpiffyFunction(TypeImNotFamiliarWith whoKnowsWhatThisVariableHas)
{
DoNothing(); // Yay! Now I can put in a breakpoint so I can see what data I'm receiving!
int i = 0;
i = i; // Another way to do nothing so I can set a breakpoint
}