Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/variables/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Can';在C中使用void变量编译_C_Variables_Types_Void - Fatal编程技术网

Can';在C中使用void变量编译

Can';在C中使用void变量编译,c,variables,types,void,C,Variables,Types,Void,test.c int main () { void a; return 0; } 我使用gcc进行编译,但它给了我一个错误: 错误:变量或字段“a”声明为无效 从我读到的, 我想我可以毫无问题地声明void变量。否,但您可以声明一个void指针:void*。void*可以容纳任何对象指针 void*只保证保存对象(即数据)指针 [但是] 将函数指针转换为void类型是不可移植的* 正如您的链接所述: 本身声明为void的变量(如上面的my_变量)是无用的;它不能被赋值,不能转换为另

test.c

int main () {
   void a;
   return 0;
}
我使用gcc进行编译,但它给了我一个错误:

错误:变量或字段“a”声明为无效

从我读到的, 我想我可以毫无问题地声明void变量。

否,但您可以声明一个void指针:
void*
void*
可以容纳任何对象指针

void*只保证保存对象(即数据)指针

[但是]

将函数指针转换为void类型是不可移植的*

正如您的链接所述:

本身声明为void的变量(如上面的my_变量)是无用的;它不能被赋值,不能转换为另一种类型,事实上,不能以任何方式使用

这意味着,尽管语法正确,Value>代码>声明对任何东西都不起作用,这就是为什么GCC认为它是错误的原因。即使它可以编译,您也无法对变量执行任何操作,因此我猜您的问题只是与测试此行为有关


事实上,
void
在我们讨论指针(
void*
)时非常有用,因为它允许您在不指定类型的情况下声明一个通用指针。

尽管书中指出
void a
是一个有效的语句,我不认为它符合标准。这就是说,该书的第一版是1987年出版的,因此它也可以从较旧的GCC实现中继承下来。

void*x是一个有效的语句

void x不是有效的语句

返回指向void的指针的函数也是有效的

为什么会这样

在函数中声明变量时,编译器必须为变量分配内存空间。但是,当一个变量的类型为void时,编译器不知道要为此变量分配多少字节。因此,这对编译器不起作用。 但是,指向void的指针是不同的。指针可以是void类型,在读取时可以读取为int、double、float、short或char。在这种情况下,编译器执行显式类型转换或自动类型升级

e、 g

一个重要的注意事项:C不允许对void指针的取消引用进行直接类型转换。 我的意思是你不能这样做:

double
function_B( void *x )
{
    return (double)*x; 
}

从概念上讲,这是完全有道理的。但是C不允许这样做。

你可以有一个指向void(
void*
)的指针,但是没有void变量。我认为有一个类型为
void
的变量没有任何用处。通常,void表示没有任何内容,例如,返回void的函数正常返回,但不将任何内容传递回调用方。在完全不同的意义上,指向void的指针只是意味着没有指定指针所指向的类型。void也可用作返回类型。同样有用的,以抑制有关忽略返回值的警告总是预览你的帖子,这样你就可以看到你犯的任何错误,比如忽略代码块前的空白行。
double
function_B( void *x )
{
    return (double)*x; 
}