【问题标题】:C++ macro with argument带参数的 C++ 宏
【发布时间】:2019-08-22 02:05:20
【问题描述】:

我想这样定义:

    #define log(x)          \
    #if (x)                 \
        cout << "\n" << x   \
    #else                   \  
        cout                \

例子:

    log() << abc 
    ~
    cout << abc

    log(name) << abc
    ~
    cout << "\n" << name << abc

这里的问题类似于C preprocessor macro specialisation based on an argument

我想使用 define,因为实际上,我使用 cout 是因为人们可以很容易地理解我的意图。

我在做 Qt 并且需要使用 QLoggingCategory 记录日志

    QLoggingCategory category("MyNameSpace");

当需要日志时,我需要使用语法

    qCDebug(category) << something_need_log

这里,qCDebug(category) 就像我的问题中的 cout

【问题讨论】:

  • 抱歉,宏不能这样工作,这不是它们的用途。使用一个非常简单的模板函数很容易做到这一点。
  • 你为什么想要使用宏?它们往往比替代方案造成更多的问题。 (我的意思是它们会引起问题,而替代品通常不会。)
  • 宏、旧式强制转换、大多数隐式转换等都是 C++ 拥有的东西,只是因为弃用它们只会破坏很多代码,但在新代码中应该避免使用它们。

标签: c++ qt macros


【解决方案1】:
#include <iostream>

std::ostream& log() {
  return std::cout;
}

std::ostream& log(const std::string& x) {
  return std::cout << "\n" << x;
}

int main() {
    log() << "message";  // std::cout << "message";
    log("name: ") << "message"; // cout << "\n" << "name: " << message;
    return 0;
}

输出:

message
name: message

【讨论】:

  • 谢谢@S.M.但我想使用 define 因为实际上,我使用 cout 是因为人们可以很容易地理解我的意图。我做 Qt 并且需要使用 QLoggingCategory QLoggingCategory category("MyNameSpace");当需要日志时,我需要使用语法 qCDebug(LogQuoteButton) qCDebug(LogQuoteButton) 就像 cout 在我的问题中。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-11-09
  • 2015-05-09
相关资源
最近更新 更多