用功能替换宏

时间:2019-02-14 07:21:17

标签: c++ c++98

我有一个宏,用于检查与opengl相关的错误

#if (GL_ERROR_CHECK == On)
#define GL_CHECK(x)                                                                                                    \
    x;                                                                                                                 \
    {                                                                                                                  \
        GLenum glError = glGetError();                                                                                 \
        if(glError != GL_NO_ERROR)                                                                                     \
        {                                                                                                              \
            std::cout << "GL Error: " << glError << " at " << __FILE__ << ", " << __LINE__ << std::endl;               \
        }                                                                                                              \
    }
#else
#define GL_CHECK(x)  x;
#endif

并按原样使用

GL_CHECK(glGenFramebuffers(1, (GLuint*)&m_u32FboID));
GL_CHECK(glBindFramebuffer(GL_FRAMEBUFFER, m_u32FboID));

我想知道是否可以用适当的c ++函数替换此宏?

2 个答案:

答案 0 :(得分:4)

如果您使用的是OpenGL 4.3及更高版本,则可以改用Debug Callback,这样您就不必在宏中包装所有GL函数:Check it out here

要启用所有功能:

glDebugMessageCallback(some_callback_function, nullptr);
glDebugMessageControl(GL_DONT_CARE, GL_DONT_CARE, GL_DONT_CARE, 0, nullptr, true);

例如,此功能:

void gl_debug_callback(GLenum source, GLenum type, GLuint id, GLenum severity,
                       GLsizei length, const GLchar* message, const void* userParam)
{
    std::cerr << "GL Debug Message: " << message << '\n';
}

请注意,有时这会输出不是错误的消息,因此您可以考虑例如打开严重性,或者对使用...MessageControl函数启用的功能进行更严格的限制。

答案 1 :(得分:2)

  

我想知道是否可以用适当的c ++函数替换此宏?

在这种情况下,我认为宏是一个不错的选择。使用宏的主要好处之一是,您可以将__FILE____LINE__用作消息的一部分。

您可以将一些代码移到函数中,但是宏仍然可以达到目的。

void checkForError(char const* file, int line)
{
   GLenum glError = glGetError();
   if(glError != GL_NO_ERROR)
   {
      std::cout << "GL Error: " << glError << " at " << file << ", " << line << std::endl;
   }
}

#if (GL_ERROR_CHECK == On)
#define GL_CHECK(x) x; checkForError(__FILE__, __LINE__);
#else
#define GL_CHECK(x) x;
#endif