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不允许这样做。
以上就是c/c++开发分享无法在C中使用void变量进行编译相关内容,想了解更多C/C++开发(异常处理)及C/C++游戏开发关注计算机技术网(www.ctvol.com)!)。
本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。
ctvol管理联系方式QQ:251552304
本文章地址:https://www.ctvol.com/c-cdevelopment/544905.html