即使缺少函数定义,编译也是成功的
Compilation is successful even if function definition is missing
我借用了这个问题的例子。有以下文件:
main.cpp
#include <iostream>
#include "foop.h"
int main(int argc, char *argv[])
{
int x=42;
std::cout << x <<std::endl;
std::cout << foo(x) << std::endl;
return 0;
}
foop.h
#ifndef FOOP_H
#define FOOP_H
int foo(int a);
#endif
foop.cpp
int foo(int a){
return ++a;
}
正如您所看到的,main.cpp
包含foop.h
,但foop.h
只包含声明,而不包含函数foo
的定义。main.cpp
如何知道foop.cpp
的存在和foo
函数的定义?我的第一个猜测是,如果*.h
的名称与*.cpp
的名称相同,那么它会神奇地工作,但当我将foop.cpp
重命名为foop2.cpp
时,它也会工作
PS:我把文件放在一个项目下,放在Visual Studio 的同一目录下
PPS:我能以某种方式调试编译过程吗?这样我就能看到发生了什么?
编译器不需要了解定义。这是链接器的工作。
相关文章:
- 即使不包含其标头,如何成功向前声明的类编译?
- VS2017 版本 15.8.3 成功编译内联方法,而不返回所需值
- 编译花絮 g++, clang++, 使用 libboost -- g++8 编译失败时 g++7 成功;
- 如何在 c++ 中导入文件?以及如何成功编译它们?
- 编译成功,使用 clang 5.0.1/6.0.0 ,在 5.0.2/6.0.1 时失败
- 分配给静态变量的局部变量;编译错误在'c'但在 C++ 中成功
- D3D11 着色器编译成功,但出现白屏
- 尝试用 c++ 制作一个简单的加法器.编译成功,但输出错误
- G++ 和 CL(VS2017) 都编译成功,但 cl 编译的可执行文件运行异常
- Qt 编译成功,但运行失败
- OpenCV简单代码编译成功,但在运行时崩溃
- 在代码块13.12上编译成功,但在ideone或spoj上编译错误
- Visual Studio Team Services编译成功,但没有EXE文件
- 使用CUDA nvcc编译时,与提升库的链接失败,使用gcc编译成功
- 抽象类类型指针编译成功
- 编译成功后找不到 openni2 库
- Visual studio .cu文件显示语法错误,但编译成功
- 如果引用必须指向有效内存,那么为什么这个程序编译成功
- c++ \ 编译成功,无法调试 - STATUS_DLL_NOT_FOUND
- 将Makefiles转换为CMAKEList(编译成功,但程序的行为不同)