错误记录C++预处理器宏__LINE __,__ FUNCTION__

use*_*523 4 c++ logging c-preprocessor

我试图将一个简单的错误记录合并到我现有的应用程序中,此时它只报告错误使用,cout所以我希望使用<<运算符保持类似的界面.但是我希望它记录行和函数发生的错误,但我不想__LINE__, __FUNCTION__每次需要记录时都要输入.有没有人知道我可以用来允许__LINE__宏在另一个函数中使用的技巧,而是报告调用行?希望有道理.

class myLogClass {
    uint8_t level;                  
public:                 
    bool operator<<( const char * input );          
};

bool myLogClass::operator<<( const char * input ) {
    logItInSQL( input );
    return true;
}
Run Code Online (Sandbox Code Playgroud)

而不是每次都这样

myLogClass << "Line No: " << __LINE__
    << " Function: " << __FUNCTION__
    << " Error: " << "This is my error to be logged";
Run Code Online (Sandbox Code Playgroud)

我想能够做到:

myLogClass << "This is my error to be logged";

bool myLogClass::operator<<( const char * input ) {
    logItInSQL( " Line No: __LINE__" );
    logItInSQL( " Function: __FUNCTION__" );
    logItInSQL( " Error: " + input );
    return true;
}
Run Code Online (Sandbox Code Playgroud)

dir*_*tly 9

myLogClass << "Line No: " << __LINE__ ...
Run Code Online (Sandbox Code Playgroud)

你的operator <<链接将无法正常工作,因为它返回了一个bool.

bool myLogClass::operator << (const char * input)
Run Code Online (Sandbox Code Playgroud)

通常按如下方式定义流插入:

std::ostream& myLogClass::operator << (std::ostream& o, const char * input) {
    // do something
    return o;
}
Run Code Online (Sandbox Code Playgroud)

做这个:

#define log(o, s) o << "Line No: " << __LINE__ << \
                   " Function: " << __FUNCTION__ << \
                   " Error: " << s // note I leave ; out
Run Code Online (Sandbox Code Playgroud)

此外,您可以将宏包装在do-while循环中:

#define log(o, s) do { o << "Line No: " << __LINE__ << \
                   " Function: " << __FUNCTION__ << \
                   " Error: " << s; \ 
                  } while(0) // here, I leave ; out
Run Code Online (Sandbox Code Playgroud)

然后你可以高兴地写:

 myLogClass myLogger; // do this

 // use it
log(myLogger, "This is my error to be logged"); // note the ;
Run Code Online (Sandbox Code Playgroud)

  • @thinkcube:谢谢!自我注意:永远不要从问题中复制粘贴.总是编译. (2认同)