【发布时间】:2022-01-13 02:02:12
【问题描述】:
我想将所有 glXXXX 调用替换为 GL_CALL(N, ...),以便我可以打印函数和参数来跟踪调用。
例如,将glClearColor(0.0f, 0.0f, 0.0f, 1.0f) 替换为GL_CALL(ClearColor, 0.0f, 0.0f, 0.0f, 1.0f),在控制台中我得到[GL_CALL] glClearColor(0, 0, 0, 1)
#include <iostream>
template <class T>
void GL_TRACE_PRINT(T const &t) {
std::cout << t << ",";
}
template<typename T, typename... Args>
void GL_TRACE_PRINT(T n, Args ... args) {
GL_TRACE_PRINT(n);
GL_TRACE_PRINT(args...);
}
#define GL_STR(s) #s
template <class F, typename ...Args>
auto GL_INVOKE(F f, Args && ...args) {
std::cout << "[GL_CALL] " << GL_STR(f) << '(';
GL_TRACE_PRINT(std::forward<Args>(args)...);
std::cout << ")\n";
return f(std::forward<Args>(args)...);
}
#define GL_CALL(N, ...) \
GL_INVOKE(gl##N, __VA_ARGS__);
但是如何打印GL_INVOKE中的函数名呢?谢谢。
或者有更好的方法吗?
目前的输出是,glXXX 函数名都是f。
[GL_CALL] f(0,0,0,1,)
[GL_CALL] f(0,0,0,1,)
【问题讨论】:
-
__function__宏? -
如果你想跟踪调用,建议你使用一些宏,如
__line__,__function等。或者,你可以使用boost.stacktrace。或者,如果您使用 C++23,您可以使用<stacktrace>中的内容。 -
__FUNCTION__宏输出 "[GL_CALL] GL_INVOKE(0,0,0,1,)" @JohnFilleau -
添加两个参数 GL_TRACE_PRINT 将有助于删除最后一个 "," :)