(对于 C++)我当前在 VS2010 中的清除宏是:
#define CLEAR(v) do { __pragma(warning(suppress: 4127 4836)) typedef std::remove_reference< decltype(v)>::type T; static_assert( std::is_pod<T>::value || (__has_trivial_constructor(T) && __has_trivial_destructor(T)), "must not CLEAR a non-POD!" ); static_assert( !std::is_pointer<T>::value, "pointer passed to CLEAR!" ); memset(&(v), 0, sizeof(v)); } while(0)
您可以使用 type_traits 标头中的内容来组成您的变体。
带解释的格式化版本:
#define CLEAR(v) \
do { \
__pragma(warning(suppress: 4127 4836)) \
typedef std::remove_reference< decltype(v)>::type T; \
static_assert( \
std::is_pod<T>::value \
|| (__has_trivial_constructor(T) && __has_trivial_destructor(T)), \
"must not CLEAR a non-POD!" ); \
static_assert( !std::is_pointer<T>::value, "pointer passed to CLEAR!" ); \
memset(&(v), 0, sizeof(v)); \
} while(0)
外部 do-while 使其在包括 if/else 在内的所有地方都像真正的函数一样可用。
需要 Remove_reference 以便它与左值一起使用, decltype 单独使 int* 和 int*& 不同,并且 is_pointer 报告后者为 false。
is_pod 检查适用于一般情况,附加条件允许 struct A1 : A; A 是 POD 且 A1 仅添加更多 POD 成员的案例工作。出于 is_pod 的目的,它是错误的,但清除它具有同样的意义。
当您在指针上获得错误的间接或混淆传递结构的地址时,is_pointer 检查会保护预期的错误类型。请使用 = NULL 清除指针。;-)
用于抑制以其他方式发出的__pragma
L4 警告。