我目前仅使用以下模板作为检查 NULL 指针的方法,如果为 NULL,则将错误消息打印到日志文件,然后返回 false。
template< typename T >
static bool isnull(T * t, std::string name = "")
{
_ASSERTE( t != 0 );
if( !t )
{
if( !(name.length()) ) name = "pointer";
PANTHEIOS_TRACE_ERROR(name + " is NULL");
return false;
}
return true;
}
我目前这样称呼它:
if( !(isnull(dim, BOOST_STRINGIZE(dim))) ) return false;
如果您注意到我需要传入要打印到日志文件的指针变量的“名称”,作为第二个参数。我目前正在使用 BOOST_STRINGIZE,它只需将括号内的任何文本转换为字符串。
以下是我的模板实现的缺点(至少对于我的使用而言)
- 任何人都可以将任何内容作为参数传递给 BOOST_STRINGIZE 以在日志文件中打印出来 - 因为这两个参数无论如何都不相关 - 所以我不一定会看到实际上为 NULL 的“变量名称”
- 我们一定要记得传入第二个参数,否则没用。
无论如何,我是否可以自动确定第一个变量的“名称”,以便我可以在每次调用时省略将其作为第二个参数传递?
您可以将所有内容放在一个宏中:
#define IS_NULL(name_) isnull(name_, #name_)
注意BOOST_STRINGIZE
如果它是一个宏,则扩展它的参数,这可能是也可能不是您想要的:
#define X(x_) std::cout << BOOST_STRINGIZE(x_) << " = " << x_ << std::endl;
X(NULL); // prints: "0 = 0"
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)