最近我遇到了一个标识符未定义错误,但很惊讶地发现这是因为有"两个"进口缺失,而不是一个。即。
#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;
答案 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()。
我应该看一下这些文件,但可能是这样的。