void
在C编程语言中算不上一种数据类型。它不能存储任何值。与用来存储值的int
, float
, char
等数据类型不同,void
通常用于表示函数返回值为空,或作为指针类型中没有特定类型的通用指针。因此,范围是不确定的。
Void被视为一种数据类型(出于组织目的),但基本上它只是一个关键字,用作占位符,代表“没有数据”,您可以在其中放置一个数据类型。
因此,您可以声明一个不返回值的例程如下:
void MyRoutine();
但是,你不能像这样声明一个变量:
void bad_variable;
然而,当用作指针时,它有不同的含义:
void* vague_pointer;
这声明了一个指针,但没有指定它所指向的数据类型。
void MyRoutine();
是一种旧式(K&R C)函数声明,在C99中已被弃用,不是原型。应该用void MyRoutine(void);
代替。 - Jensvoid*
类型的值执行算术运算,gcc通过假装sizeof(void) == 1
来支持这种扩展。 (个人认为这很不幸。) - Keith Thompsonextern void foo;
- Svenvoid
类型具有相同的属性。它们都是不完整的类型,但例如所有指向结构体类型的指针具有相同的表示方式;void *
可能具有相同的表示方式,也可能没有。此外,不完整的结构体类型可以被完整定义;而void
则不能。 - Keith Thompson是的,void
是一种类型。它是否是数据类型取决于您如何定义该术语;C标准没有确定。
C标准定义了"对象类型"这个术语。在C99和之前版本中,void
不是对象类型;在C11中,它是对象类型。在所有版本的标准中,void
是不完整类型。在C11中改变的是不完整类型现在是对象类型的一个子集;这只是一个术语上的变化。(另一种类型是函数类型。)
C99第6.2.6段第19条说:
void类型包括一个空值集;它是一个不完整类型,无法完成。
C11标准稍微更改了措辞:
void类型包括一个空值集;它是一个不完整的对象类型,无法完成。
这反映了C11中"对象类型"的定义变化,包括不完整类型;它并没有真正改变类型void
的本质。
void
关键字也可以在其他一些上下文中使用:
在函数原型中作为唯一的参数类型,如int func(void)
,表示该函数没有参数。 (C ++使用空括号表示此内容,但在C中它们表示其他内容。)
作为函数的返回类型,如void func(int n)
,表示该函数不返回结果。
void*
是一种指针类型,不指定它指向什么。
原则上,所有这些用法都涉及类型 void
,但您也可以将它们视为只是使用相同关键字的特殊语法。
int func()
和 int func(void)
之间的区别。区别在于后者是一个原型,它指定该函数不带任何参数。前者是旧式的函数声明,不指定函数预期的参数。(很少有好的理由使用旧式的函数声明。) - Keith ThompsonC标准规定void
是一种无法完成的不完整类型(与其他可以完成的不完整类型不同)。这意味着您不能对void
应用sizeof
运算符,但可以拥有指向不完整类型的指针。
extern void x;
。1)如果 x
可以在“C 之外”完成(例如在汇编中),那么为什么 &x
是无效的?2)是否存在对 x
的有效操作? - pmor&x
不是无效的,void x
以及其后面的所有内容都是无效的。至于第二点,应该有两个 void x
分配给 void y
的情况,但是由于编译器不知道 x 和 y 的大小,所以这是不可能的。 - Jens&x
在这种情况下是无效的(即如果 x
声明为 extern void x;
)"。 - pmor-std=c11 -pedantic -Wall -Wextra
下都接受extern const void x; const void* p = &x;
。这段代码有效吗?如果无效,那么为什么Clang和GCC决定接受它呢? - pmor<type-qualifier> void
类型对象(例如 const void
)的表达式是左值。 - pmor
myFunction() { /* ... */ }
看起来太整洁了,就不得不添加一些无意义的void myFunction(void) { /* ... */ }
- 我认为如果你无法忍受使用char *
,还有其他更清晰的选项,这是在void出现之前声明“通用”指针的常见方式。 - Christoffer Bubachfunction(void)
并不等同于function()
,因为在前者中你可以完全不传递参数,而在后者中你可以传递任何参数:https://www.geeksforgeeks.org/difference-int-main-int-mainvoid (除了C++,在C++中两者都表示函数不接受任何参数) - Edw590