g++ __FUNCTION__ replace time

后端 未结 7 708
迷失自我
迷失自我 2020-12-20 17:16

Can anyone tell when g++ replaces the __FUNCTION__ \'macro\' with the string containing the function name? It seems it can replace it not until it has check the

7条回答
  •  庸人自扰
    2020-12-20 17:46

    Note that if you create a class, you can build a message from any number of types as you'd like which means you have a similar effect to the << operator or the format in a printf(3C). Something like this:

    // make sure log remains copyable
    class log
    {
    public:
      log(const char *function, const char *filename, int line)
      {
        f_message << function << ":" << filename << ":" << line << ": ";
      }
      ~log()
      {
        //printf("%s\n", f_message.str().c_str()); -- printf?!
        std::cerr << f_message.str() << std::endl;
      }
    
      log& operator () (const char *value)
      {
        f_message << value;
      }
      log& operator () (int value)
      {
        f_message << value;
      }
      // repeat with all the types you want to support in the base class
      // (should be all the basic types at least)
    private:
      sstream f_message;
    };
    
    // start the magic here
    log log_error(const char *func, const char *file, int line)
    {
      log l(func, file, line);
      return l;
    }
    
    // NOTE: No ';' at the end here!
    #define LOG_DEBUG  log_error(__func__, __FILE__, __LINE__)
    
    // usage sample:
    LOG_DEBUG("found ")(count)(" items");
    

    Note that you could declare the << operators instead of the (). In that case the resulting usage would be something like this:

    LOG_DEBUG << "found " << count << " items";
    

    Depends which you prefer to use. I kind of like () because it protects your expressions automatically. i.e. if you want to output "count << 3" then you'd have to write:

    LOG_DEBUG << "found " << (count << 3) << " items";
    

提交回复
热议问题