在C ++中传递变量“name”

时间:2010-02-24 19:10:53

标签: c++

我目前使用以下模板作为检查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
  • 我们必须记住传递第二个参数,否则无用。

无论如何我可以自动确定第一个变量的“名称”,以便我可以省略每次调用时将其作为第二个参数传入吗?

3 个答案:

答案 0 :(得分:9)

你可以将它全部放在一个宏中:

#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"

答案 1 :(得分:1)

当然,为什么不:

#define new_isnull(x)  isnull(x, BOOST_STRINGIZE(x))

答案 2 :(得分:1)

在词汇上做任何事情的唯一方法就是使用宏。如果您总是想要正确的打印输出,最好的选择是将整个语句包装在一个宏中:

//if( !(isnull(dim, BOOST_STRINGIZE(dim))) ) return false;
#define ISNULL(a) isnull((a), #a)
if (!ISNULL(dim)) return false;

请注意,与往常一样,宏有许多与之相关的缺点。