代码之家  ›  专栏  ›  技术社区  ›  ReeSSult

用预处理器C++定义常见错误消息

  •  -2
  • ReeSSult  · 技术社区  · 6 年前

    假设我在多个地方调用函数 int foo(x, y) .根据返回代码,我决定是否打印错误消息。所以代码看起来类似于:

      void func1()
        {
            ...
            if(foo(x,y))
                std::cerr << "Error occurred with values" << x << "," << y << __LINE__;
            ...
        }
    
        void func2()
        {
            ...
            if(foo(x,y))
                std::cerr << "Error occurred with values" << x << "," << y << __LINE__;
            ...
        }
    

    我的问题是 "Error occurred" 在很多地方重复着,在任何地方都是一样的。我想知道使用 #define 再利用它们。所以代码是这样的:

      #define errMsg(x,y) \
        std::string("Error occurred with values " + to_string(x) + "," + to_string(y) + to_string(__LINE__))
    
      void func1()
        {
            ...
            if(foo(x,y))
                std::cerr << errMsg;
            ...
        }
    
        void func2()
        {
            ...
            if(foo(x,y))
                std::cerr << errMsg;
            ...
        }
    
    1 回复  |  直到 6 年前
        1
  •  1
  •   selbie    6 年前

    很明显,要做的就是将错误消息放入 foo 本身。如果你做不到,就把它包起来:

    bool fooWithLogging(int x, iny y)
    {
        auto result = foo(x,y);
        if (result)
        {
            std::cerr << "Error occurred with values" << x << "," << y << std::endl;
        }
    }
    

    在代码中调用包装器:

    void func1()
    {
        ...
        fooWithLogging(x,y);
        ...
    }
    
    void func2()
    {
        ...
        fooWithLogging(x,y);
        ...
    }
    

    奖励:使日志动态化:

    #ifdef DEBUG
    bool g_isFooLoggingEnabled = true;
    #else
    bool g_isFooLoggingEnabled = false;
    #endif
    
    bool fooWithLogging(int x, iny y)
    {
        auto result = foo(x,y);
        if (result && g_isFooLoggingEnabled)
        {
            std::cerr << "Error occurred with values" << x << "," << y << std::endl;
        }
    }
    

    现在,您的文件和行要求刚刚在评论中提到:

    bool _fooWithLogging(int x, iny y, const std::string& filename, int line)
    {
        auto result = foo(x,y);
        if (result && g_isFooLoggingEnabled)
        {
            std::cerr << "Error occurred in file" << filename << " on line " << line << " with values" << x << "," << y << std::endl;
        }
    }
    
    #define FooWithLogging(x, y) _fooWithLogging(x, y, __FILE__, __LINE__)
    

    然后在代码中:

    void func1()
    {
        ...
        FooWithLogging(x,y);
        ...
    }