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