Nic*_*los 163 c c# c++ terminology language-design
希望得到" 无效 "一词来源的基础知识,以及为什么它被称为无效.这个问题的目的是帮助那些没有C经验的人,并突然看到一个基于C的代码库.
Ger*_*ald 218
基本上它意味着"没有"或"没有类型"
使用void有3种基本方法:
函数参数:int myFunc(void)
- 函数不需要任何操作.
函数返回值:void myFunc(int)
- 函数不返回任何内容
通用数据指针:void* data
- 'data'是指向未知类型数据的指针,不能解除引用
注意:void函数参数在C++中是可选的,因此int myFunc()完全相同int myFunc(void),并且在C#中完全省略.返回值始终是必需的.
Joh*_*itb 31
我一直认为这意味着缺席.以下是C语言中与缺席使用相匹配的四种情况
R f(void)- 缺少功能参数void f(P)-返回值是不存在的void *p- 缺少指向的类型(void) p- 缺少使用价值其他C后代用它来做其他事情.该D编程语言使用它的情况下的初始化是不存在的
T t = void;- 缺少初始化值Rob*_*nes 14
有两种方法可以使用void:
void foo(void);
Run Code Online (Sandbox Code Playgroud)
要么
void *bar(void*);
Run Code Online (Sandbox Code Playgroud)
第一个表示没有传递参数或没有返回参数.
第二个告诉编译器没有与数据相关联的类型,这意味着在将其转换为已知类型之前,您无法使用指向的数据.
例如,void*当你有一个接口调用一个参数不能提前知道的函数时,你会看到很多用过的东西.
例如,在推迟工作时的Linux内核中,你将设置一个函数,以便在后一次运行时给它一个指向要运行的函数的指针和一个指向要传递给函数的数据的指针:
struct _deferred_work {
sruct list_head mylist;
.worker_func = bar;
.data = somedata;
} deferred_work;
Run Code Online (Sandbox Code Playgroud)
然后一个内核线程遍历一个延迟工作列表,当它到达这个节点时,它会有效地执行:
bar(somedata);
Run Code Online (Sandbox Code Playgroud)
然后在酒吧你有:
void bar(void* mydata) {
int *data = mydata;
/* do something with data */;
}
Run Code Online (Sandbox Code Playgroud)