【问题标题】:Pass variable "name" in C++在 C++ 中传递变量“名称”
【发布时间】:2010-02-24 19:10:53
【问题描述】:

我目前使用以下模板只是作为检查 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(a) isnull((a), #a)
  • 第二个问题可以通过去掉name参数的默认值来解决。只有切线相关,使用“name.empty()”可能比“!name.length()”更快和/或更清晰
  • @Mark-B。感谢您的“空”评论:)。我想我只是假设由于 vector.empty() 实际上调用了 size() (在 VC++ 2005 实现中),因此字符串可能是相同的。糟糕的ossandcad。

标签: c++


【解决方案1】:

您可以将所有内容放在一个宏中:

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

【讨论】:

  • 你想要一个像BOOST_STRINGIZE 这样的字符串化宏,否则它总是会传递“name_”。
  • 怎么样,# 字符串化name_BOOST_STRINGIZE 的不同之处仅在于它扩展了 name_,如果它是一个我不一定认为有优势的宏。 :)
  • 我在想别的事情:3 我的两个 cmets 都会在未指定的时间内神秘地消失。
  • 哇,这很简单。问出这样的问题,我几乎感觉很愚蠢。我最初在想一些复杂的 Boost Preprocessor 东西。谢谢。
  • @ossabdcad:没有人在他们第一次被介绍到c预处理器时给予足够的关注,直到之后他们才真正研究它 他们已经花了很长时间来解决这样的问题。这是您的俱乐部会员证书。吃两片阿司匹林,早上回来……
【解决方案2】:

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

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

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

【讨论】:

    【解决方案3】:

    当然,为什么不呢:

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

    【讨论】:

    • 谢谢。使用 # 而不是 BOOST_STRINGIZE 是公认答案的优势。
    猜你喜欢
    • 2013-10-02
    • 1970-01-01
    • 2021-03-14
    • 1970-01-01
    • 1970-01-01
    • 2017-07-21
    • 1970-01-01
    • 1970-01-01
    • 2017-05-22
    相关资源
    最近更新 更多