即使缺少函数定义,编译也是成功的

Compilation is successful even if function definition is missing

本文关键字:编译 成功 定义 函数      更新时间:2023-10-16

我借用了这个问题的例子。有以下文件:

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:我能以某种方式调试编译过程吗?这样我就能看到发生了什么?

编译器不需要了解定义。这是链接器的工作。