【问题标题】:Replace macro with function用函数替换宏
【发布时间】:2019-02-14 07:21:17
【问题描述】:

我有一个用来检查 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++ 函数替换这个宏?

【问题讨论】:

标签: c++ c++98


【解决方案1】:

如果您使用的是 OpenGL 4.3 及更高版本,则可以改用调试回调,这样您就不必将每个 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 函数启用的内容进行更严格的限制。

【讨论】:

  • 但是源位置(__FILE____LINE__)丢失了。
  • @Jarod42 例如,如果严重性足够高,您可以在调试回调中添加断点,如果您跳出函数或查看调用堆栈,您可以看到它发生在哪里.
  • 它假设它是在“本地”机器上完成的。例如,我们无法从用户日志中获取这些信息。
【解决方案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

【讨论】:

  • 可以使用std::experimental::source_location 完全删除宏(但仍处于实验阶段:-/)...
  • @Jarod42 GCC 有 __builtin_LINE()__builtin_FILE(),它们做类似的事情。
猜你喜欢
  • 2014-03-18
  • 2020-04-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-03-26
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多