"未定义的引用"与"未声明"
'undefined reference' with 'not declared'
这是C编译和链接中的一个简单问题。但我想讨论编译器和链接器的原理。
void f();
int main()
{
f();
}
此代码收到错误消息"未定义对'f()'的引用"
int main()
{
f();
}
此代码收到错误消息"未在此范围内声明 F"有什么区别?更重要的是,代码
void f()
{
}
int main()
{
f();
}
运行良好。
在第一种情况下,你声明一个函数,但不定义它。 它可以正确编译,但没有链接,因为没有定义f
。 因此链接器错误。
在第二种情况下,您尝试调用未声明的符号。 编译器不知道f
是什么,因此会发出错误。 这是编译过程不同阶段的不同问题,因此消息不同。
在第三种情况下,您有一个定义良好的程序(除了 main
无法返回值)。 f
既是声明的,也是定义的。 程序应正确编译、链接和执行。
澄清这个问题。您应该知道代码如何成为可执行程序。第一步是"编译"。将您的源代码编译成二进制文件的 *.o 文件。第二个如果"链接"。将您的 *.o 文件合并到可执行文件中。在你的第一个例子中,你声明了函数f
,但你没有定义它。因此,当链接器链接 *.o 文件时,它找不到函数f
。在第二个示例中,您使用函数f
而不进行声明或实现。因此,编译器会报告错误。在第三个示例中,函数f
实现提前使用它。没错。
相关文章:
- 未定义的标识符/未声明
- 未声明的标识符错误,但变量定义正确 (?)
- 未定义与已删除与未声明的函数
- 具有未声明/未定义类型的 typedef 结构
- 前向声明:未定义的类 ( C2079 )
- C++链接编辑器找不到函数声明(未定义的引用)
- 函数参数中未声明和未定义的标识符
- 错误:'ALIGN'未声明(在此函数中首次使用),并将 ALIGN 定义为宏
- 如何声明省略号定义为未使用va_list
- 尝试和捕获中的对象声明未在范围内定义
- 未声明的标识符?我以为我定义了它
- 定义中未声明的标识符错误 C2065,显然存在
- 在类声明中定义静态变量时未解析的外部符号
- 未声明未使用的变量.gcc在取笑我
- 如果未在类声明中定义函数,则性能损失
- "未定义的引用"与"未声明"
- 我想返回一个向量函数,<Competition>但被告知竞争是未声明的,并且我正在使用未定义的类'std::vector'
- C++括号和格式问题(未声明的标识符,本地函数定义是非法的)
- 未声明标识符和标识符未定义是什么意思?如何修复错误
- 标头已定义,但不可见。 'm_nCmdShow':未声明的标识符