由标头组合定义的标识符
Identifier defined by a combination of headers?
最近我遇到了一个标识符未定义错误,但惊讶地发现这是因为缺少"两个"导入,而不是一个。即
#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。
我应该看一下这些文件来确定,但可能是这样的。
相关文章:
- Visual Studio C++ PlaySound 标识符未定义
- 在模板化函数中重新定义(忽略)的 SWIG 标识符
- 删除动态数组时未定义标识符
- 未定义的标识符/未声明
- 标识符Class_name未定义C++ oop
- 标识符"hWnd"未定义
- 为什么更改包含 psapi.h 的顺序会产生编译错误?(标识符 BOOL 未定义)
- 未声明的标识符错误,但变量定义正确 (?)
- Visual Studio 2019 概念标识符未定义
- 存储在 C++ 编译器中的标识符的定义(不是声明)在哪里?
- 标识符"DDRB"未定义 - VS code / Visual Studio
- 在头文件中使用opencv类型来实现未定义的标识符
- 标识符"in"未定义
- 智能感知:标识符"node"未定义
- 将以"_[a-z0-9]"开头和"using"的标识符导入全局命名空间是否定义良
- 标识符"__readgsqword"未定义 - Visual Studio 2017
- 标识符"V 未定义
- 标识符"thread"未定义
- 标识符uint8_t未定义 - Visual Studio 2017
- 如何在 PEGTL 的 c++ 中通过属性/标识符定义 unicode 范围