Answers:
基本上,它的意思是“无”或“无类型”
有3种使用void的基本方法:
函数参数:int myFunc(void)
-函数不执行任何操作。
函数返回值:void myFunc(int)
-函数不返回任何内容
通用数据指针:void* data
-“数据”是指向未知类型数据的指针,无法取消引用
注意:void
函数参数in在C ++中是可选的,因此int myFunc()
与完全相同int myFunc(void)
,并且在C#中完全省略了。返回值始终是必需的。
我一直认为它是缺席的。以下是C语言中与这种用法不相符的四种情况
R f(void)
- 缺少功能参数void f(P)
-返回值是不存在的void *p
-所指向的类型不存在(void) p
- 缺乏价值使用其他C后代将其用于其他用途。该D
编程语言使用它的情况下的初始化是不存在的
T t = void;
- 缺少初始化值(void)p
办?我没有完全理解“缺乏价值使用”的意思。
(void) var;
声明也感到困惑,我可以在stackoverflow.com/q/21045615找到详细的答案。
有两种使用void的方法:
void foo(void);
要么
void *bar(void*);
第一个表示没有参数传递或没有参数返回。
第二个告诉编译器没有与数据有效关联的类型,这意味着在将其转换为已知类型之前,您无法使用指向的数据。
例如,void*
当您有一个接口调用一个函数(其参数无法提前知道)时,您会发现使用了很多。
例如,在Linux内核中,当推迟工作时,您将为函数提供指向要运行的函数的指针和指向要传递给该函数的数据的指针,以设置稍后运行的函数:
struct _deferred_work {
sruct list_head mylist;
.worker_func = bar;
.data = somedata;
} deferred_work;
然后,内核线程遍历了一系列延迟的工作,当到达该节点时,它将有效地执行:
bar(somedata);
然后在栏中,您将:
void bar(void* mydata) {
int *data = mydata;
/* do something with data */;
}
将无效视为“空结构”。让我解释。
每个函数都有一个参数序列,其中每个参数都有一个类型。实际上,我们可以将参数打包成一个结构,结构槽对应于这些参数。这使得每个函数只有一个参数。类似地,函数产生一个具有类型的结果。它可以是布尔值,也可以是浮点数,也可以是包含任意一组其他类型值的结构。如果我们想要一个具有多个返回值的语言,可以很容易地坚持将它们打包到一个结构中。实际上,我们总是可以坚持认为函数要返回结构。现在,每个函数只使用一个参数,并产生一个值。
现在,当我需要一个产生“无”值的函数时会发生什么?好吧,考虑一下当我形成一个具有3个插槽的结构时得到的结果:它包含3个值。当我有2个插槽时,它包含两个值。如果有一个插槽,则为一个值。而且当它有零个插槽时,它保存着……呃,零值或“无”值。因此,我可以认为函数返回void就是返回不包含任何值的结构,甚至可以确定“ void”只是空结构表示的类型的同义词,而不是语言中的关键字(也许只是预定义的类型:)
类似地,我可以认为一个不需要任何值的函数就可以接受一个空结构,例如“ void”。
我什至可以用这种方式实现我的编程语言。传递void值占用零字节,因此传递void值只是传递任意大小的其他值的一种特殊情况。这使编译器可以轻松地处理“无效”结果或参数。您可能想要一种可以丢弃函数结果的语言功能。在C中,如果在以下语句中调用非无效结果函数foo:foo(...); 编译器知道foo会产生结果,而只是忽略它。如果void是一个值,则可以很好地工作,现在“过程”(对于具有void结果的函数只是形容词)只是一般函数的平凡特殊情况。
虚空*有点有趣。我不认为C设计师会以上述方式考虑到void。他们只是创建了一个关键字。当有人需要指向任意类型的点时,该关键字可用,因此void *作为C中的惯用法。如果将void解释为空结构,则实际上效果很好。void *指针是放置空结构的地方的地址。
对于其他类型T,从void *到T *的转换也可以从这种角度得出。指针强制转换是在大多数常见体系结构上都能发挥作用的完整作弊,以利用以下事实:如果复合类型T的存储布局中的T开头物理上放置了一个子类型为S的元素,则将S *转换为T *并反之亦然,因为大多数机器指针只有一个表示形式,所以倾向于使用相同的物理机器地址。用void类型替换类型S可获得完全相同的效果,因此可以对void *进行强制转换。
PARLANSE编程语言非常紧密地实现了上述想法。我们对它的设计感到厌烦,并且没有密切注意“ void”作为返回类型,因此有用于过程的langauge关键字。它主要是一个简单的语法更改,但是一旦获得了一种语言的大量主体工作代码,您就不会了解它。
在c#中,您将使用void关键字来指示方法不返回值:
public void DoSomeWork()
{
//some work
}
如果您要向初学者解释该概念,那么使用类比可能会有所帮助。在所有这些情况下,void的使用类似于一本书中的页面,该页面上带有以下单词:“此页面故意留为空白”。它是为了区别于编译器,在应该标记为错误的内容与故意留空的类型之间进行区分,因为这是您想要的行为。
它总是出现在通常希望看到一种类型的代码中,例如返回类型或指针类型。这就是为什么在C#中void将映射到实际的CLR类型System.Void的原因,因为它本身就是类型。
某些编程语言从未提出过空的概念,就像某些人类文化从未发明零数字的概念一样。无效代表编程语言的进步,零代表人类语言。
虚空表示从三种语言的函数返回类型时均不需要值。
无效等效于Visual Basic的Sub。