Gojira Asked: 2020-04-29 11:02:59 +0800 CST 2020-04-29 11:02:59 +0800 CST 2020-04-29 11:02:59 +0800 CST void 作为函数的参数 772 我遇到过这段代码。使用 void 是一个美学问题,表明该函数没有参数,还是该函数真的需要 void 类型的东西?是否存在 void 类型(除了用于声明一个不返回任何内容的函数)? c++ 3 Answers Voted Best Answer abulafia 2020-04-29T11:19:16+08:002020-04-29T11:19:16+08:00 单词void, 可以作为函数的参数出现,表示它不接收参数,作为返回类型,表示函数不返回任何内容,或者作为指针的类型,如下所示: void *p; 最后一个案例很有趣。指向“无”的指针是什么意思?在这种情况下void,它不被理解为“无”,而是“随便”。上面的语句只是声明了一个指针,但“不想”进入指向位置的详细信息。 这样的指针以后可以用来指向整数、实数或字符,等等。为它分配内存会malloc()正常使用,分配的字节数取决于我们以后打算如何使用它。例如,如果我想将 a 存储float在 所指向的地址,p则需要保留 a 占用的字节数float: p = malloc(sizeof(float)); 但是为了以后给它赋值,有必要使用强制转换,否则,如果我们像这样使用它: *p = 3.1415926; 编译器会给出一个错误,说明 a void. p 它需要临时转换为指向 的指针float,如下所示: *(float *)p = 3.1415926; 这样做的用处主要在于能够将指针传递给我们不想在编译时指定的类型,因为同一个函数可以支持不同的类型(另一个函数参数可以指定例如如何使用指针) ... 实际上,在无法以任何其他方式完成的情况下,跳过类型仍然是一个“肮脏”的技巧。 user23371 2020-04-29T14:59:03+08:002020-04-29T14:59:03+08:00 您使用的是 C++,并且在该语言中,使用void是为了促进 C 代码的重用。表示函数接收void int mifunct( void ); 这与指示函数不接收任何参数相同: int mifunct( ); 这使您可以毫不费力地将原始 C 语言代码编译成 C++ 编译器。 如果你在 C 中,事情会发生很大变化:一个函数 int mifunct( void ); 就像在 C++ 中一样,它是一个不带参数的函数。然而,一个什么都没有的函数: int mifunct( ); 表示可以接收任何参数类型的函数: void myfunct( ); int main( void ) { myfunct( 10 ); myfunct( "Hola mundo !\n" ); return 0; } void myfunct( ) { } 上面的代码编译没有错误。 Gabriel Castillo 2022-07-11T12:40:56+08:002022-07-11T12:40:56+08:00 实际上,在 C 中使用 void 不仅仅是为了美观,请考虑以下程序: #include <stdio.h> int incrementa(); int main() { int y = incrementa(); printf("Hello world! [%d]\n",y); return 0; } int incrementa(int n) { return n+1; } 如果你编译,你会注意到它并没有在gcc中标记错误,但是在调用函数时有问题,它需要一个参数,但编译器没有检测到它,甚至创建了可执行代码。这是因为当函数原型中没有放置参数时,编译器假定它可以接收任意数量的参数。 如果您尝试编译相同的代码,但在原型中加入 void 一词,您会发现编译器正确识别了问题。 [1]我传递的参数数量与定义的不同,但它可以编译并工作
单词
void
, 可以作为函数的参数出现,表示它不接收参数,作为返回类型,表示函数不返回任何内容,或者作为指针的类型,如下所示:最后一个案例很有趣。指向“无”的指针是什么意思?在这种情况下
void
,它不被理解为“无”,而是“随便”。上面的语句只是声明了一个指针,但“不想”进入指向位置的详细信息。这样的指针以后可以用来指向整数、实数或字符,等等。为它分配内存会
malloc()
正常使用,分配的字节数取决于我们以后打算如何使用它。例如,如果我想将 a 存储float
在 所指向的地址,p
则需要保留 a 占用的字节数float
:但是为了以后给它赋值,有必要使用强制转换,否则,如果我们像这样使用它:
编译器会给出一个错误,说明 a
void
.p
它需要临时转换为指向 的指针float
,如下所示:这样做的用处主要在于能够将指针传递给我们不想在编译时指定的类型,因为同一个函数可以支持不同的类型(另一个函数参数可以指定例如如何使用指针) ... 实际上,在无法以任何其他方式完成的情况下,跳过类型仍然是一个“肮脏”的技巧。
您使用的是 C++,并且在该语言中,使用
void
是为了促进 C 代码的重用。表示函数接收void
这与指示函数不接收任何参数相同:
这使您可以毫不费力地将原始 C 语言代码编译成 C++ 编译器。
如果你在 C 中,事情会发生很大变化:一个函数
就像在 C++ 中一样,它是一个不带参数的函数。然而,一个什么都没有的函数:
表示可以接收任何参数类型的函数:
上面的代码编译没有错误。
实际上,在 C 中使用 void 不仅仅是为了美观,请考虑以下程序:
如果你编译,你会注意到它并没有在gcc中标记错误,但是在调用函数时有问题,它需要一个参数,但编译器没有检测到它,甚至创建了可执行代码。这是因为当函数原型中没有放置参数时,编译器假定它可以接收任意数量的参数。
如果您尝试编译相同的代码,但在原型中加入 void 一词,您会发现编译器正确识别了问题。
[1]我传递的参数数量与定义的不同,但它可以编译并工作