在C ++中将uint64_t转换为void类型的目的是什么?

时间:2018-07-30 10:13:39

标签: c++

我在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会产生副作用。它的副作用是什么?

1 个答案:

答案 0 :(得分:3)

纯粹是为了消除潜在的编译器有关未使用参数的警告。

如果在发行版中,构建assert定义为:

#define assert( expr )

由于block_offset仅在断言中使用,编译器可能会警告该参数未使用,因为这通常表示存在错误。抑制警告的另一种方法是使用未命名的参数(例如no_ioconst_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_UNUSEDhttp://doc.qt.io/qt-5/qtglobal.html#Q_UNUSED

Boost具有ignore_unusedhttps://www.boost.org/doc/libs/1_67_0/libs/core/doc/html/core/ignore_unused.html