Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/133.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++ 有人能告诉我为什么在成员函数的定义中使用这样的代码:`Base::fool(T1*pub,T2*info){(void)pub;(void)info;}`_C++ - Fatal编程技术网

C++ 有人能告诉我为什么在成员函数的定义中使用这样的代码:`Base::fool(T1*pub,T2*info){(void)pub;(void)info;}`

C++ 有人能告诉我为什么在成员函数的定义中使用这样的代码:`Base::fool(T1*pub,T2*info){(void)pub;(void)info;}`,c++,C++,下面提供了相关的过程代码。我经常在可以在Linux和Windows上运行的开源项目中看到这种代码。有人告诉我这是为了避免编写警告。真的是这样吗 class Base { public: virtual void on_publication_matched(Publisher* pub, PublicationMatchedStatus& info) { (void)pub; (void)info; } }; 我想知道为什么不这样

下面提供了相关的过程代码。我经常在可以在Linux和Windows上运行的开源项目中看到这种代码。有人告诉我这是为了避免编写警告。真的是这样吗

class Base
{
public:
    virtual void on_publication_matched(Publisher* pub, PublicationMatchedStatus& info)
    {
        (void)pub;
        (void)info;
    }
};
我想知道为什么不这样定义它:

class Base
{
public: 
       virtual void on_publication_matched(Publisher* pub, PublicationMatchedStatus& info){};
};

这是为了避免未使用的变量警告。声明
(void)pub
是一个noop(不做任何事情),但它仍然引用变量。因此,编译器不会抱怨未使用
pub


其他示例无法避免未使用的变量警告,将成员函数抽象化可能并不可取,也不是最初的意图。

让我们看看前两个示例。它们定义了一个什么都不做的函数。不同之处在于空心铸件

(void)pub;
(void)info;
这通常用于避免编译器发出
未使用变量
警告。它对
void
执行强制转换。表达式随后被丢弃,因此实际上,例如
(void)pub
什么也不做,但编译器不会抱怨未使用的变量。由于c++17,您可以使用以下属性:

virtual void on_publication_matched([[maybe unused]]Publisher* pub, 
                                    [[maybe unused]]PublicationMatchedStatus& info){}
或者,您也可以编写:

virtual void on_publication_matched(Publisher*,PublicationMatchedStatus&){}
这也不会发出警告。但是,我更喜欢使用描述性参数名称。正如@JaMiT所说,您可以使用内联注释来获取:

virtual void on_publication_matched(Publisher*/*pub*/,
                                    PublicationMatchedStatus& /*info*/){}

上一个示例将函数标记为纯虚拟函数,这与第一个到第二个示例大不相同。也就是说,您不能创建纯虚拟类的实例。您需要在派生类中提供一个实现来创建它的实例。也请看这个。

也许相关@Inga谢谢。但我看不出这确实与这个问题有任何关系。你为什么要放一个
在函数体的
{}
之后?这个
是什么东西,也是一个宏?@UlrichEckhardt我已经重新编辑了它。现在它正确了吗?期待您的回复。虽然您找到了丢失的
,但只收到了一半在类主体之后。顺便问一下:代码缩进到什么程度与您的问题有什么关系?你知道这三种变体的区别吗?我明白了。我认为你是对的。但我仍然认为,为打算什么都不做的函数报告未使用的变量警告有点奇怪。@John编译器不知道函数的意图。警告是为了让您知道该函数不执行任何操作。据编译器所知,您可能打算返回此函数,但忘记了这样做。使用参数的语句告诉编译器该函数不打算做任何事情,因此不再发出警告。@JaMiT很高兴再次见到您。我已经困惑了很长时间;你现在告诉我清楚了。我非常感谢你。还有一个问题,为什么
(void)pub
(void)pub
是什么意思?我知道您可以使用其他表达式来避免警告,但这不是关键点。能告诉我这个表达是什么意思吗?我看过很多这样的代码,但我没有使用过。谢谢你的澄清。我完全理解你说的话。我毫不怀疑你是对的。但我仍然认为,对于那些不打算执行任何操作的函数,报告未使用的变量警告有点奇怪。在另一个世界里,我不认为编译器应该报告这样的警告。不幸的是,我不是编译器工作原理方面的专家。所以我不能告诉你,为什么编译器没有检查你的建议。也许其他人可以。另一种使用方法是
匹配的出版物上的虚拟无效(Publisher*/*pub*/,PublicationMatchedStatus&/*info*/){}
。不过,不是每个人都喜欢这个选择。@JaMiT你是对的,我完全忘记了。我将进行编辑,将其包含在我的答案中。@StefanKssmr感谢您的澄清。在你的帮助下,我完全理解。还有一个问题,
(void)pub
到底是什么意思?我从来没有写过这样的代码。
virtual void on_publication_matched(Publisher*/*pub*/,
                                    PublicationMatchedStatus& /*info*/){}