我不明白,如果没有.h文件,“连接”是如何建立的。
代码如下:
文件main.c:
void Run( void ) ;
int main(void)
{
Run() ;
}
文件:run.cpp:
static MyClass gMyClassInstance;
extern "C" {
void Run( void )
{
gMyClassInstance->Run();
}
}
在整个项目中搜索Run
,从未再次出现,也不在任何.h文件中。它是怎么做到的?
2条答案
按热度按时间ldfqzlk81#
.h
文件用于避免从.c/.cpp
文件到.c/.cpp
文件的重复声明(当函数不是本地定义的时,编译器需要声明)。在你的例子中,有一个声明
void Run( void );
,直接在main.c
中,而不是在一个单独的.h
中,这对编译器来说就足够了。与run.cpp
中定义的Run
函数的连接将由链接器建立(作为名为_Run
的入口点)。tf7tbtn22#
在C和C中,每个.cpp或.c文件都被编译为一个单独的翻译单元。在此过程中有三个相关阶段:预处理、编译和链接。
在预处理期间,
#include
命令被解释为复制并粘贴头文件的内容。每个预处理文件都是文本文件,并且仍然是有效的C或C。如果您想了解更多有关过程的信息,编译器可能允许您预处理文件并观察结果文件。然后单独编译预处理文件。从编译器的Angular 来看,函数声明最初在哪里并不重要,因为它作用于预处理的文件。您可以将预处理后的文件作为.cpp文件添加到项目中,它仍然可以编译。
因为文件是单独编译的,所以通常调用在不同转换单元中定义的函数。函数声明只是告诉编译器该函数将在程序中的某个位置找到。
在每个翻译单元编译完成后,链接器处理它们以生成最终程序。这包括找到每个函数定义,并与每个函数调用建立连接。如果未找到定义,则会出现错误。