宏在字符串末尾添加字符而不传递源字符串

时间:2016-03-10 03:50:15

标签: c++ macros

我正在尝试编写一个宏,在字符串的末尾添加一个char(结束函数键)而不传递源字符串。

声明:

LEVEL_ENTRY(level) << "Level1 Message";

预期的宏观扩张

LEVEL_ENTRY(level) levelParser(level, std::ostringstream().flush() << "Level1 Message");

我正在尝试这样

#define LEVEL_ENTRY(level) levelParser(level, std::ostringstream().flush()

使用C ++宏可以实现这种扩展(不通过args)吗?

修改

目前我正在做的工作

#define LEVEL_ENTRY(level, msg) levelParser(level, std::ostringstream().flush() << msg)

LEVEL_ENTRY(level, "Level1 Message"<< "Message2");

真正的问题是我现在不能简单地改变声明'它在项目的1000多个地方使用。

3 个答案:

答案 0 :(得分:3)

不,你不能<<宏的事情。宏由预处理器处理,C ++语言解析器不会看到,并且宏不支持任何类型的<<语法。

  

宏是代号的片段,它已被赋予名称。每当使用该名称时,它将被宏的内容替换。有两种宏。它们的区别主要在于它们在使用时的外观。类似对象的宏在使用时类似于数据对象,类似函数的宏类似于函数调用。

https://gcc.gnu.org/onlinedocs/cpp/Macros.html

答案 1 :(得分:2)

当然,但没有涉及宏:

class LEVEL_ENTRY {
    public:
        LEVEL_ENTRY(level): level_(level) {}
        LEVEL_ENTRY(LEVEL_ENTRY const &) = delete;
        LEVEL_ENTRY & operator=(LEVEL_ENTRY const &) = delete;

        ~LEVEL_ENTRY() {
             levelParser(level, oss);
        }

        LEVEL_ENTRY & operator<<(const char *message) {
             oss << message;
        }

    private:
        int level_;
        std::ostringstream oss;
};

LEVEL_ENTRY(1) << "Level1 Message";

答案 2 :(得分:2)

解决问题的一种方法是:

struct Foo { int level; };

auto operator<<(Foo foo, char const *s)
{ 
    return levelParser(foo.level, std::ostringstream().flush() << s);
}

#define LEVEL_ENTRY(level) Foo{level}