我正在查看一些具有如下函数的代码:
void f(A* a, B& b, C* c)
{
(void)a;
(void)b;
(void)c;
}
每行开头的(void)究竟是什么?
答案 0 :(得分:9)
你看到的只是一个"技巧"伪造变量/参数用法。
如果没有这些行,一个迂腐的编译器会警告你没有使用的变量。
使用构造(void)variablename;
将导致不生成任何指令,但编译器会认为它是有效的"使用"那些变数。
答案 1 :(得分:3)
它只是一个避免编译器警告的kludge。例如,该代码将发出
warning: unused parameter ‘a’ [-Wunused-parameter]
warning: unused parameter ‘b’ [-Wunused-parameter]
warning: unused parameter ‘c’ [-Wunused-parameter]
如果没有使用kludge,则使用gcc -Wall -Wextra
进行编译时。虽然有更清洁的方法来实现这一目标。您可以省略参数名称:
void f(A*, B&, C*) {
}
gcc-specificc和稍微详细的替代方法是在每个未使用的参数上使用unused
属性:
void f(A* a __attribute__((unused)), B& b, C* c) {
}
答案 2 :(得分:2)
我看到至少有两次反应。第一个是避免编译器警告变量已定义但未在函数体中使用。
第二个是它是非常古老的代码,如果没有使用表达式的结果,有时程序员会在表达式之前写入转换为void。这有助于编译器优化生成的目标代码。
答案 3 :(得分:-3)
每当我们用C ++编写函数时,我们都需要遵循函数原型,即
类型名称(parameter1,parameter2,...){statements}
此处type-代表它返回的值的类型
返回类型的void允许您定义不返回值的函数。请注意,它与返回0不同.0的值是integer,float,double等类型;这不是一个空白。 (在其他语言中,没有返回值的函数可以被称为"子例程"或"过程",而"函数"总是返回一些东西。在C /中C ++,它们都被称为函数。) 返回无效意味着什么都不返回。
指向void的指针是一个通用指针,可以在该位置的数据类型未知时使用。所以你可以使用一种void *来引用内存中的地址而不知道实际位于那里的地址。