Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/opengl/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何使用回调?_C++_Opengl_Variadic Functions_Glad - Fatal编程技术网

C++ 如何使用回调?

C++ 如何使用回调?,c++,opengl,variadic-functions,glad,C++,Opengl,Variadic Functions,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 be

我使用生成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函数的值,因此可以是任何类型。但是,我必须指定要访问的类型才能访问这些值


我觉得参数
len_args
暗示有某种方法可以迭代varargs,但是我不明白在不知道类型的情况下应该如何使用它。它们将如何使用?

只要调用了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);

}
这意味着第一个参数是格伦。请参阅有关如何使用变量参数的问题:

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

因此,您可以决定哪些函数需要更好的调试日志。我不知道是否已经有一些免费代码可以提供更好的调试输出

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

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