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

时间:2015-12-22 17:24:36

标签: c++ opengl header undefined identifier

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

#include <a.h>

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

不会编译因为&#34; foo&#34;未定义。

#include <b.h>

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

也不会编译因为&#34; foo&#34;未定义。

但是:

#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未定义。为清楚起见,两种情况下的错误都是&#34;错误:标识符&#34; glClear&#34;未定义&#34;

1 个答案:

答案 0 :(得分:0)

使用preprocessor directives,您可以默默地&#34;隐藏&#34;编译时的代码片段。

例如,如果a.h具有:

#define A_INCLUDED
b.h可能有:

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

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

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