在下面的代码中,程序员将一个函数的名称放在if条件中,好像在继续之前检查一些东西并注册一个回调:
#if _DEBUG
if(glDebugMessageCallback) // He checks this function, presumably it returns true if it exists
{
cout << "Register OpenGL debug callback " << endl;
glEnable(GL_DEBUG_OUTPUT_SYNCHRONOUS);
glDebugMessageCallback(openglCallbackFunction, nullptr); // Calls the function here
GLuint unusedIds = 0;
glDebugMessageControl(GL_DONT_CARE,
GL_DONT_CARE,
GL_DONT_CARE,
0,
&unusedIds,
true);
}
else
cout << "glDebugMessageCallback not available" << endl; // So if the if condition evaluated to false, the function doesn't exist.
#endif
我的问题是为什么这种检查函数是否存在的方法?如果一个函数不存在肯定你会收到编译错误,告诉你该函数不存在,这对我来说似乎很奇怪。我基本上知道函数地址的计算结果为bool,之前我问了一个问题并且被告知函数地址对于bool的隐式转换并不是特别有用,我也看不出如何。
我还应该提到if条件中的函数是MACRO定义,定义为:
#define glDebugMessageCallback GLEW_GET_FUN(__glewDebugMessageCallback)
如果它是一个定义宏有所作为。
答案 0 :(得分:0)
glDebugMessageCallback要么是null(0),要么是匹配所需签名的函数的(可能是有效的)地址。
对于任何非null值,if语句将评估为true,对于null值,将评估为false。 (可能存在编译器警告,但代码将起作用。)
因此,如果glDebugMessageCallback初始化为null,并且从未设置为函数地址,则if语句将计算为false。如果将glDebugMessageCallback设置为函数的地址,则if块中的代码将被执行,并且将调用该函数。