Определение общих сообщений об ошибках с препроцессором C ++ - PullRequest
0 голосов
/ 17 января 2019

Допустим, у меня есть несколько мест, где я вызываю функцию 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 Ответ

0 голосов
/ 17 января 2019

Очевидное, что нужно сделать, это просто поместить сообщение об ошибке в 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;
    }
}

А теперь с вашими требованиями FILE и LINE, которые только что упоминались в комментариях:

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);
    ...
}
...