• static_cast<void>(0)的意义及NDEBUG assert的使用


    查看ace代码时发现如下代码

     1 #define ACE_TEST_ASSERT(X) 
     2   ((X)                      
     3    ? static_cast<void>(0)   
     4    : ACE_VERSIONED_NAMESPACE_NAME::__ace_assert(__FILE__, __LINE__, ACE_TEXT_CHAR_TO_TCHAR (#X)))
     5 
     6 #if defined (ACE_NDEBUG)
     7 #define ACE_ASSERT(x) 
     8   (static_cast<void>(0))
     9 #else
    10 #define ACE_ASSERT(X) ACE_TEST_ASSERT(X)
    11 #endif /* ACE_NDEBUG */

    使用NDEBUG可以使assert失效,这在c中同样成立。

    而static_cast<void>(0)的作用为避免编译器弹出warning提醒,这是因为如果这里直接写0的话,则当编译时,由于该处没有执行代码,编译器会弹出:"Warning: expression 0; has no effect."的提示。因此static_cast<void>(0)告知编译器这里进行了格式转换,避免弹出提示。

    static_cast<void>(0)是c++中的写法,在c中则为assert.h

     1 #ifdef NDEBUG
     2 
     3     #define assert(expression) ((void)0)
     4 
     5 #else
     6 
     7     _ACRTIMP void __cdecl _wassert(
     8         _In_z_ wchar_t const* _Message,
     9         _In_z_ wchar_t const* _File,
    10         _In_   unsigned       _Line
    11         );
    12 
    13     #define assert(expression) (void)(                                                       
    14             (!!(expression)) ||                                                              
    15             (_wassert(_CRT_WIDE(#expression), _CRT_WIDE(__FILE__), (unsigned)(__LINE__)), 0) 
    16         )
    17 
    18 #endif
    
    
  • 相关阅读:
    [ZJOI 2012]数列
    [JSOI 2011]柠檬
    sonar错误及修改方案
    mysql 查询该字段不包含中文
    service 事务
    mysql 不等于和null
    java文件编译为class文件
    主,副时间排序
    MySQL 按首字母排序
    excle导入
  • 原文地址:https://www.cnblogs.com/zl1991/p/9306455.html
Copyright © 2020-2023  润新知