由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。
我应该看看那些文件才能确定,但可能是这样的。
最近我 运行 遇到了标识符未定义的错误,但惊讶地发现这是因为缺少 "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。
我应该看看那些文件才能确定,但可能是这样的。