繁体   English   中英

无法在C中使用void变量进行编译

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM