【发布时间】:2019-05-26 23:57:04
【问题描述】:
C 中的void 类型在各种不同的情况下似乎很奇怪。有时它的行为类似于普通对象类型,例如 int 或 char,有时它只是毫无意义(应该如此)。
看看我的sn-p。首先,您可以声明 void 对象似乎很奇怪,这意味着您什么都不声明。
然后我创建了一个int 变量并将其结果转换为void,将其丢弃:
如果任何其他类型的表达式被评估为 void 表达式,其值或指示符被丢弃。 (ISO/IEC 9899:201x,6.3.2.2 无效)
我尝试使用 void 强制转换调用我的函数,但我的编译器给了我 (Clang 10.0):
error: too many arguments to function call, expected 0, have 1
所以原型中的void 表示nothing,而不是void 类型。
然后,我创建了一个指向void 的指针,取消引用它,并将“result”分配给我的int 变量。我收到“不兼容的类型”错误。 这意味着这里确实存在void 类型。
extern void a; // Why is this authorised ???
void foo(void); // This function takes no argument. Not the 'void' type.
int main(void)
{
int a = 42;
void *p;
// Expression result casted to 'void' which discards it (per the C standard).
(void)a;
// Casting to 'void' should make the argument inexistant too...
foo((void)a);
// Assigning to 'int' from incompatible type 'void': so the 'void' type does exists...
a = *p;
// Am I not passing the 'void' type ?
foo(*p);
return 0;
}
void 是实际类型,还是关键字 to 没有任何意义?因为有时它的行为类似于“此处不允许任何内容”指令,有时则类似于实际类型。
编辑:此问题不重复。这纯粹是关于 void 类型的语义。我不想解释如何使用void、指向void 的指针或任何其他东西。我想要一个符合 C 标准的答案。
【问题讨论】:
-
可以将转换为 void 的变量传递给函数,然后在函数中转换回原始数据类型,例如
void* thread_func((void)args),然后在 thread_func 函数中用作(struct args)args -
@Auxilus 我对此表示怀疑。将
void传递给不兼容类型的参数struct args时会出错。 -
不一样的情况。我说的是
void类型,一个不能完成的不完整类型,它和完整类型“指向void”的指针不是一回事。 -
void是实际类型;但是(void)的函数参数列表意味着该函数不带参数;并不是说它需要一个void类型的参数。 (void类型的参数是不允许的)
标签: c language-lawyer standards semantics void