我在RocksDB's source code中看到以下代码:
bool FullFilterBlockReader::KeyMayMatch(const Slice& key, uint64_t block_offset,
const bool /*no_io*/,
const Slice* const /*const_ikey_ptr*/) {
#ifdef NDEBUG
(void)block_offset;
#endif
assert(block_offset == kNotValid);
if (!whole_key_filtering_) {
return true;
}
return MayMatch(key);
}
(void)block_offset
是类型转换,其结果未使用。因此,(void)block_offset
会产生副作用。它的副作用是什么?
答案 0 :(得分:3)
纯粹是为了消除潜在的编译器有关未使用参数的警告。
如果在发行版中,构建assert
定义为:
#define assert( expr )
由于block_offset
仅在断言中使用,编译器可能会警告该参数未使用,因为这通常表示存在错误。抑制警告的另一种方法是使用未命名的参数(例如no_io
和const_ikey_ptr
)。您也可以像这样抑制警告:
bool FullFilterBlockReader::KeyMayMatch(const Slice& key,
uint64_t
#ifdef NDEBUG
block_offset
#endif
,
const bool /*no_io*/,
const Slice* const /*const_ikey_ptr*/) {
assert(block_offset == kNotValid);
if (!whole_key_filtering_) {
return true;
}
return MayMatch(key);
}
但是它不是那么可读。通过使用未完成的参数宏来做同样的事情来更明确地表明您正在做什么:
#define UNUSED_PARAM( param ) (void)param
void f( int a )
{
UNUSED_PARAM( a );
}
Qt定义了Q_UNUSED
:http://doc.qt.io/qt-5/qtglobal.html#Q_UNUSED。
Boost具有ignore_unused
:https://www.boost.org/doc/libs/1_67_0/libs/core/doc/html/core/ignore_unused.html