【问题标题】:Concatenating a string and passing as a parameter?连接字符串并作为参数传递?
【发布时间】:2015-09-01 21:52:46
【问题描述】:

我编写了自己的记录器,可以按如下方式使用:

LOG("This is the number five: " << 5 << ".");

我想写一个错误检查方法,它只接受一个返回码,检查它是否是一个错误,如果是则打印一个错误消息

因此,我想转:

if(result == -1)
{
    LOG("ERROR! We got a result of: " << result << ".");
    // Do some other stuff
}

进入:

checkForError(result, "ERROR! We got a result of: " << result << ".");

void checkForError(int result, SomeStringType message)
{
    if(result == -1)
    {
    LOG(message);
    // Do some other stuff
    } 
}

这可能吗?我尝试将它作为 char*、std:string 和 stringstream 传递,但我似乎无法让它正常工作

有什么方法可以做到这一点,所以我只是在函数调用中连接错误消息?

【问题讨论】:

  • 你考虑过ostringstream吗?
  • #define LOG_ON_FAIL(result, prompt) if(-1 == result) {LOG((prompt)
  • 字符文字永远不会很好地接受"ERROR! We got a result of: " &lt;&lt; result &lt;&lt; "." (operator&lt;&lt;) 操作。这不是你得到这个工作的方式。

标签: c++ string concatenation


【解决方案1】:

是的,这是可能的。你可以这样做:

#define LOG(X)                                   \
        do {                                     \
            std::ostringstream log_stream;       \
            log_stream << X;                     \
            LOG::log_internal(log_stream.str()); \
        } while (0)

LOG::log_internal 可能在您的记录器标头中声明,例如

struct LOG {
    static void log_internal(const std::string &);
};

这样做的主要缺点是它不是有史以来最卫生的宏——如果参数X 包含分号,那么您可以在宏的范围内执行其他语句,并且不会出现编译器错误。在我看来,这个宏远非神秘,幸运的是,您实际上不必担心攻击者会对您的宏执行 SQL 注入式攻击。

我在我的项目中使用基本上看起来像这样的记录器,并且我从其他项目中学会了这样做。 (实际上我使用的更发达一点,它还将__FILE____LINE__ 传递给LOG::log_internal 函数,并且有日志通道和日志级别可能会或可能不会处于活动状态等......)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-24
    相关资源
    最近更新 更多