【发布时间】:2011-07-20 23:37:25
【问题描述】:
我最近开始学习 C 语言,并注意到函数“void()”,但是,我想知道它的作用以及它的最佳应用点,也可能是 void 的替代方案,它可能更有效率.谢谢。
【问题讨论】:
-
没有名为
void的函数。你能用一个例子告诉我们你看到了什么吗?
我最近开始学习 C 语言,并注意到函数“void()”,但是,我想知道它的作用以及它的最佳应用点,也可能是 void 的替代方案,它可能更有效率.谢谢。
【问题讨论】:
void的函数。你能用一个例子告诉我们你看到了什么吗?
void在C中有三种用途:
声明一个函数不返回值:
void foo(int x);
声明一个函数不接受参数:
int baz(void);
(DANGER WILL ROBINSON!) 声明一个“通用指针”,它可以被传递,例如一个神奇的 cookie,或者在回调中传回给某人,在那里被转换回原来的类型。
int register_callback(void (*foo)(void *baz), void *bar);
register_callback 使用指向 void 函数的指针调用,该函数期望作为参数的指针可能对它有意义。在将来的某个(未指定)时间,将调用该函数,并以 bar 作为参数。您会在某些类型的嵌入式执行器和可重用设备驱动程序中看到这种情况,尽管在任何地方都没有。
【讨论】:
void*,而不是void。它们是两个非常不同的东西。
volatile 限定符并且您想让编译器冷静下来,您可以使用它。在我的宏中,我还有一些经常派上用场的东西,P99_NOP 扩展为 (void)0。例如,如果你想声明一个包含多个语句的宏,包括 break,你可以使用 if (1) { .... } else P99_NOP 而不是常用的 do { ... } while(0)。
没有称为void 的函数,但可以使用void 的返回类型声明函数。这意味着该函数不返回值。
void DoSomething(...)
{
....
}
更新
void 也可用于向编译器指示该函数不接受任何参数。例如,
float CalculatePi(void)
{
....
}
【讨论】:
f(void) 表示函数不接受参数,而f() 表示不对参数进行类型检查。
void 作为函数参数什么时候有用?
#include "stdlib.h"
#include "stdio.h"
void foo();
int main()
{
foo(5); // Passing 5 though foo has no arguments. Still it's valid.
return 0;
}
void foo()
{
printf("\n In foo \n") ;
}
在上面的 sn-p 中,虽然 foo() 原型没有参数,但传递一些东西给它仍然是有效的。所以,为了避免这样的事情发生-
void foo(void) ;
现在可以保证向foo() 传递任何内容都会产生编译器错误。
【讨论】:
void 作为函数参数有用。所以,发布了这个sn-p。
foo(5) 无效,即它调用了UB。为了有效,它必须根据函数定义(而不是声明)在不带参数的情况下调用。编译器使用声明来了解返回类型(并检查参数):在上面的程序中,没有检查参数但参数需要与函数定义匹配。
<stdlib.h> 和<stdio.h>(请注意,您没有在程序中使用<stdlib.h> 中声明的任何内容)。
我认为没有 void() 函数。
但是,void 关键字用于表示函数不返回任何内容,例如:
void MyFunction() {
// function body here
}
【讨论】: