Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/129.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/google-apps-script/6.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
C++ (void)在c++;?_C++ - Fatal编程技术网

C++ (void)在c++;?

C++ (void)在c++;?,c++,C++,我在看一些代码,它的函数如下所示: void f(A* a, B& b, C* c) { (void)a; (void)b; (void)c; } 每行开头的(空)具体是做什么的 你所看到的其实只是一个伪装变量/参数用法的“把戏” 如果没有这些行,迂腐的编译器将警告您没有使用变量 使用构造(void)变量名不会产生任何指令,但编译器会认为这些变量是有效的“使用”。 每当我们在C++中编写函数时,我们需要遵循函数的原型,即 类型名称(参数1,参数2,…{statemen

我在看一些代码,它的函数如下所示:

void f(A* a, B& b, C* c)
{
   (void)a;
   (void)b;
   (void)c;
}

每行开头的(空)具体是做什么的

你所看到的其实只是一个伪装变量/参数用法的“把戏”

如果没有这些行,迂腐的编译器将警告您没有使用变量


使用构造
(void)变量名不会产生任何指令,但编译器会认为这些变量是有效的“使用”。

每当我们在C++中编写函数时,我们需要遵循函数的原型,即

类型名称(参数1,参数2,…{statements}

此处type-表示它返回的值的类型

  • 返回类型void允许您定义不返回值的函数。请注意,它与返回0不同。0的值为整型、浮点型、双精度型等;这不是空虚。(在其他语言中,没有返回值的函数可以称为“子程序”或“过程”,而“函数”总是返回一些东西。在C/C++中,它们都称为函数。) 返回void意味着什么也不返回

  • 指向void的指针是一个通用指针,当该位置的数据类型未知时,可以使用它。因此,您可以使用void*类型来引用内存中的地址,而不知道实际位于那里的是什么


  • 我看到至少有两个原因。第一个是避免编译器发出警告,即变量已定义但未在函数体中使用


    第二个问题是,它是非常古老的代码,如果表达式的结果未被使用,程序员有时会在表达式之前编写强制转换来作废。这有助于编译器优化生成的目标代码。

    为了避免编译器警告,这只是一个难题。例如,该代码将发出

    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的一个特定且有点冗长的替代方法是对每个未使用的参数使用
    unused
    属性:

    void f(A* a __attribute__((unused)), B& b, C* c) {
    }
    

    由于变量未使用,您希望避免出现警告。这是一种复杂的方式,表示
    void f(a*,B&,C*){}
    。您应该提供更多上下文。这段代码出现的软件是什么?首先点击Google(强制作废):好的,但是功能的意义是什么?因为这就是这个函数所做的一切。这可能是一个存根,然后。。。为兼容性而创建。。主代码调用函数
    f
    。对于xyz体系结构,这是定义的,对于abcd体系结构,它是存根的,如图所示。@JesperEvertsson没有任何用处,优化编译器很可能会将其完全删除(即不为其生成任何代码)。它可能是要实现的某个东西或某个遗留东西的占位符。@Mario好的,在代码中深入研究了一些内容之后,这个函数是这个类基类中的一个虚拟函数。所以我想它不需要为这个特殊的子类做任何事情。为了确保我理解正确,如果我删除了函数中的所有内容,程序应该仍然可以正常工作?@JesperEvertsson。它本质上意味着“如果没有在派生类中重新实现,就什么也不做”。删除函数中的行不会改变任何东西(除了对未使用变量的可能抱怨)。这不是OP在这里要求的。第二段:它不仅仅是非常旧的代码。即使是最新的编译器版本(如GCC),如果您启用迂腐的警告,并且在未强制转换到
    void
    的情况下不使用某些函数的返回码,也会抱怨。尽管老实说,上面的代码中没有第二个用法,这可能是一个误导性的陈述,如果任何参数是函数指针。另一种摆脱行并避免警告的方法是,只需从参数中删除名称,一切都可以:
    void f(a*,B&,C*){}