[英]Can't compile with void variable in C
test.c的
int main () {
void a;
return 0;
}
我使用gcc编译,但它给了我一个错误:
错误:变量或字段'a'声明为void
从我在这里读到的,我以为我可以毫无问题地声明void变量。
如您的链接所述:
一个本身声明为void的变量(例如上面的my_variable)是无用的; 它不能赋值,不能转换为其他类型,实际上不能以任何方式使用。
这意味着虽然语法正确,但void
声明对任何东西都没用,这就是GCC认为它是错误的原因。 即使它会编译,你也无法对变量做任何事情,所以我猜你的问题只与测试这种行为有关。
事实上,当我们讨论指针( void*
)时, void
很有用,因为它允许你声明一个通用指针而不指定类型。
不,但你可以声明一个void指针: void *
。 void *
可以保存任何对象指针。
void *只能保证保存对象(即数据)指针
[但]
将函数指针转换为void *是不可移植的
虽然这本书说明了void a;
是一个有效的声明,我不认为它符合标准。 话虽这么说,这本书的第一版是从1987年开始的,所以它也可能是旧版GCC实施的结转。
void *x;
是一个有效的声明。
void x;
不是一个有效的声明。
返回指向void的指针的函数也是有效的。
为什么会这样?
在函数中声明变量时,编译器必须为变量分配内存空间。 但是当变量的类型为void时,编译器不知道要为此变量分配多少字节。 所以这对编译器不起作用。 但是,指向void的指针是不同的。 指针可以是void类型,可以在读取时读取为int或double或float或short或char。 在这种情况下,编译器将完成所需的显式类型转换或自动类型提升。
例如
int
function_A( void *x )
{
int *p = (int *)x;
return *p;
}
double
function_B( void *x )
{
double *p = (double *)x;
return *p;
}
一个重要的注意事项:C不允许直接类型化取消引用void指针。 我的意思是你不能这样做:
double
function_B( void *x )
{
return (double)*x;
}
从概念上讲,这非常有意义。 但C不允许这样做。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.