【问题标题】:When can "void()" be used and what are the advantages of doing so什么时候可以使用“void()”,这样做有什么好处
【发布时间】:2011-07-20 23:37:25
【问题描述】:

我最近开始学习 C 语言,并注意到函数“void()”,但是,我想知道它的作用以及它的最佳应用点,也可能是 void 的替代方案,它可能更有效率.谢谢。

【问题讨论】:

  • 没有名为void的函数。你能用一个例子告诉我们你看到了什么吗?

标签: c function void


【解决方案1】:

void在C中有三种用途:

  1. 声明一个函数不返回值:

    void foo(int x);
    
  2. 声明一个函数不接受参数:

    int baz(void);
    
  3. (DANGER WILL ROBINSON!) 声明一个“通用指针”,它可以被传递,例如一个神奇的 cookie,或者在回调中传回给某人,在那里被转换回原来的类型。

    int register_callback(void (*foo)(void *baz), void *bar);
    

register_callback 使用指向 void 函数的指针调用,该函数期望作为参数的指针可能对它有意义。在将来的某个(未指定)时间,将调用该函数,并以 bar 作为参数。您会在某些类型的嵌入式执行器和可重用设备驱动程序中看到这种情况,尽管在任何地方都没有。

【讨论】:

  • 第四个:强制转换一个表达式(函数调用左右)以丢弃它的值,只评估它的副作用。
  • 第 3 点处理void*,而不是void。它们是两个非常不同的东西。
  • @Jens:你可以这样使用它,但我从未见过有人打扰。你最后一次做 (void)printf(...) 是什么时候?
  • @John,例如,如果表达式有 volatile 限定符并且您想让编译器冷静下来,您可以使用它。在我的宏中,我还有一些经常派上用场的东西,P99_NOP 扩展为 (void)0。例如,如果你想声明一个包含多个语句的宏,包括 break,你可以使用 if (1) { .... } else P99_NOP 而不是常用的 do { ... } while(0)
  • @Jens,我通常不相信“让编译器平静下来”。在这种事情上,他通常比我聪明得多,并且会告诉我我真正想知道的事情。 (至少,这是我过去 30 年左右的经历......)
【解决方案2】:

没有称为void 的函数,但可以使用void 的返回类型声明函数。这意味着该函数不返回值。

void DoSomething(...)
{
  ....
}

更新

void 也可用于向编译器指示该函数不接受任何参数。例如,

float CalculatePi(void)
{
 ....
}

【讨论】:

  • 我的错误。我的意思是: void 代替函数的参数应该做任何特别的事情吗?它只是告诉编译器该函数没有特定的参数吗?
  • 在 C89 中,f(void) 表示函数不接受参数,而f() 表示不对参数进行类型检查。
【解决方案3】:

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() 传递任何内容都会产生编译器错误。

【讨论】:

  • @Dillion 您的评论之一是指 void 作为函数参数有用。所以,发布了这个sn-p。
  • 调用foo(5) 无效,即它调用了UB。为了有效,它必须根据函数定义(而不是声明)在不带参数的情况下调用。编译器使用声明来了解返回类型(并检查参数):在上面的程序中,没有检查参数但参数需要与函数定义匹配
  • 标头的正确标识是<stdlib.h><stdio.h>(请注意,您没有在程序中使用<stdlib.h> 中声明的任何内容)。
【解决方案4】:

我认为没有 void() 函数。

但是,void 关键字用于表示函数不返回任何内容,例如:

void MyFunction() {
   // function body here
}

【讨论】:

    猜你喜欢
    • 2011-12-20
    • 2011-01-21
    • 2011-02-24
    • 2013-11-24
    • 1970-01-01
    • 2013-09-13
    • 2011-05-05
    • 2014-10-25
    • 1970-01-01
    相关资源
    最近更新 更多