代码之家  ›  专栏  ›  技术社区  ›  Ted Klein Bergman

如何使用回调?

  •  1
  • Ted Klein Bergman  · 技术社区  · 7 年前

    我正在使用 glad 生成OpenGL绑定,并已生成调试版本,其中包括以下内容:

    // this symbol only exists if generated with the c-debug generator
    #define GLAD_DEBUG
    typedef void (* GLADcallback)(const char *name, void *funcptr, int len_args, ...);
    
    /*
     * Sets a callback which will be called before every function call
     * to a function loaded by glad.
     *
     */
    GLAPI void glad_set_pre_callback(GLADcallback cb);
    
    /*
     * Sets a callback which will be called after every function call
     * to a function loaded by glad.
     *
     */
    GLAPI void glad_set_post_callback(GLADcallback cb);
    

    文档给出了如何定义此回调的示例,如下所示:

    void _post_call_callback_default(const char *name, void *funcptr, int len_args, ...) {
        GLenum error_code;
        error_code = glad_glGetError();
    
        if (error_code != GL_NO_ERROR) {
            fprintf(stderr, "ERROR %d in %s\n", error_code, name);
        }
    }
    

    我不明白的是我该怎么进入瓦拉格家。我猜它们是传递给OpenGL函数的值,因此可以是任何类型。但是,我必须指定要使用的类型 va_arg 以便访问这些值。

    我觉得这个参数 len_args

    1 回复  |  直到 7 年前
        1
  •  1
  •   andreaplanet    7 年前

    无论何时调用glad\u set\u post\u回调函数,都有glad.c的源代码。在这里,您可以看到参数取决于调用了哪个函数。因此,我认为您需要检查name/funcptr参数。 例如,如果叫glEnable,则您有:

    void APIENTRY glad_debug_impl_glEnable(GLenum arg0) {    
        _pre_call_callback("glEnable", (void*)glEnable, 1, arg0);
         glad_glEnable(arg0);
        _post_call_callback("glEnable", (void*)glEnable, 1, arg0);
    
    }
    

    an-example-of-use-of-varargs-in-c 关于如何使用变量参数:

    可能是这样的(未经测试):

    void _post_call_callback_default(const char *name, void *funcptr, int len_args, ...) {
        GLenum error_code;
        error_code = glad_glGetError();
        if (error_code != GL_NO_ERROR && funcptr == (void*)glEnable /* or strcmp(name,"glError") == 0*/) {
            va_list ap;
            va_start(ap, len_args);
            GLenum arg0 = va_arg(ap, GLenum);
            va_end(ap);
            printf("Called glError(%d) with Error %d\n", arg0, error_code);
        }
    }
    

    也许最好将funcptr与指向glEnable的指针进行比较,而不是将字符串名与“glError”进行比较。我没有测试它。上面的代码只是一个示例,我将以不同的方式编写它。

    推荐文章