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

C++ 宏在字符串末尾添加字符,而不传递源字符串,c++,macros,C++,Macros,我试图编写一个宏,在字符串末尾添加一个char(end函数键),而不传递源字符串 声明: LEVEL_ENTRY(level) << "Level1 Message"; 这种扩展(不通过ARG)是否可能与C++宏?< /P> 编辑 为了使它目前的工作,我正在做像 #define LEVEL_ENTRY(level, msg) levelParser(level, std::ostringstream().flush() << msg) LEVEL_ENTRY(leve

我试图编写一个宏,在字符串末尾添加一个char(end函数键),而不传递源字符串

声明:

LEVEL_ENTRY(level) << "Level1 Message";

这种扩展(不通过ARG)是否可能与C++宏?< /P> 编辑

为了使它目前的工作,我正在做像

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

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

\define LEVEL_ENTRY(LEVEL,msg)levelParser(LEVEL,std::ostringstream().flush()不,您不能
确定,但不涉及宏:

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";
class-LEVEL\u条目{
公众:
级别\条目(级别):级别\条目(级别){}
级别输入(级别输入常量&)=删除;
LEVEL_ENTRY&operator=(LEVEL_ENTRY const&)=delete;
~LEVEL_ENTRY(){
levelParser(level,oss);
}

级别输入和操作员解决问题的一种方法是:

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}
structfoo{int-level;};

自动操作器宏是有效的,但是生成的代码无效。因此,Sujin -花一点时间重新阅读你的问题,你的“预期宏扩展”是无效的C++,也包含宏。粗略地说,如果你想使事情与宏一起工作,使用宏,以相关材料作为争论。你说,你已经有了1000个这种符号的实例。因此,在一台带有
sed
的现代机器上修复它应该需要,哦,几秒钟的时间,即使它在1000个文件中只出现一次,并且每个文件都有20K行和1个MiB,这是不可能的。如果你(或你的前任之一)如果设计不当,当需求发生变化时,可能需要付出巨大的努力来修复。感谢您的解释。请查看我的更新问题您的更新问题仍然意味着您希望宏扩展到传递给它的参数之外(您期望的语句有一个“)'在
之后,我无法更改现有语句。它在项目中的1000多个位置都有用您说过要生成以下代码:
LEVEL_ENTRY(LEVEL)levelParser(LEVEL,std::ostringstream().flush()我期望的宏扩展是有效的C++语法。我将类型传递给标准字符串流。请检查我的编辑在哪里我如何实现这个。注意,这对于<代码> ListIORION条目(3)@ Bill Lynch不适用。你的评论是我的确切要求,这就是为什么我使用OSTRIGNSWOR.LIVEL条目(3)。@sujin是否希望将所有流式处理的结果传递给levelParser?最好更新问题的第一部分以包含此用法?顺便说一句,flush()与
ostringstream()相同
,当它为空时,没有什么可以刷新的。为每个语句创建类的实例不是一个好主意。@sujin为什么不呢?事实上,您正是在用
ostringstream
类的实例来做这件事。
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";
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}