由headers的组合定义的标识符?

Identifier defined by a combination of headers?

最近我 运行 遇到了标识符未定义的错误,但惊讶地发现这是因为缺少 "two" 导入,而不是一个。即

#include <a.h>

int main(int argc, char ** argv)
{
    foo();
    return 0;
}

无法编译,因为 "foo" 未定义。

#include <b.h>

int main(int argc, char ** argv)
{
    foo();
    return 0;
}

也不会编译,因为 "foo" 未定义。

但是:

#include <a.h>
#include <b.h>

int main(int argc, char ** argv)
{
    foo();
    return 0;
}

很好。我不确定这怎么可能。有谁知道这里发生了什么?为什么 foo() 是以某种方式由这两个 headers 的组合定义的,而不是单独定义的?

为了完整起见,这是在 windows 上摆弄 OpenGL 时发生的。产生此行为的确切代码是:

#include <Windows.h>
#include <gl/GL.h>
int main(int argc, char ** argv)
{
    glClear(1);
}

如果两个 headers 中的 缺失,则 glClear 未定义。为清楚起见,两种情况下的错误都是 "Error: Identifier "glClear" is undefined"

使用preprocessor directives,你可以在编译时静默"hide"段代码。

例如,如果 a.h 有:

#define A_INCLUDED

b.h 可能有:

#ifdef A_INCLUDED
void foo(void) { return; }
#endif

这样,b.h 将不会声明 foo() 除非之前包含 a.h。

我应该看看那些文件才能确定,但​​可能是这样的。