由标头组合定义的标识符

Identifier defined by a combination of headers?

本文关键字:标识符 定义 组合      更新时间:2023-10-16

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

#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()是由这两个标头的组合定义的,而不是单独定义的?

为了完整起见,这发生在一些在windows上摆弄OpenGL的过程中。产生这种行为的确切代码是:

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

其中,如果两个标头中的任一个丢失,则glClear未定义。为了清楚起见,这两种情况下的错误都是"错误:标识符"glClear"未定义"

使用预处理器指令,您可以在编译时静默地"隐藏"代码片段。

例如,如果a.h具有:

#define A_INCLUDED

b.h可能有:

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

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

我应该看一下这些文件来确定,但可能是这样的。