if语句检查有什么作用?

时间:2017-09-21 12:44:46

标签: c++ function if-statement boolean

在下面的代码中,程序员将一个函数的名称放在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)

如果它是一个定义宏有所作为。

1 个答案:

答案 0 :(得分:0)

glDebugMessageCallback要么是null(0),要么是匹配所需签名的函数的(可能是有效的)地址。

对于任何非null值,if语句将评估为true,对于null值,将评估为false。 (可能存在编译器警告,但代码将起作用。)

因此,如果glDebugMessageCallback初始化为null,并且从未设置为函数地址,则if语句将计算为false。如果将glDebugMessageCallback设置为函数的地址,则if块中的代码将被执行,并且将调用该函数。