在没有头文件的情况下从C调用CPP函数

cngwdvgl  于 2023-05-16  发布在  其他
关注(0)|答案(2)|浏览(357)

我不明白,如果没有.h文件,“连接”是如何建立的。
代码如下:
文件main.c:

void Run( void ) ;
int main(void)
{
    Run() ;
}

文件:run.cpp:

static MyClass gMyClassInstance;
extern "C" {
    void Run( void )
    {
       gMyClassInstance->Run();
    }

}

在整个项目中搜索Run,从未再次出现,也不在任何.h文件中。它是怎么做到的?

ldfqzlk8

ldfqzlk81#

.h文件用于避免从.c/.cpp文件到.c/.cpp文件的重复声明(当函数不是本地定义的时,编译器需要声明)。
在你的例子中,有一个声明void Run( void );,直接在main.c中,而不是在一个单独的.h中,这对编译器来说就足够了。与run.cpp中定义的Run函数的连接将由链接器建立(作为名为_Run的入口点)。

  • 头文件在C/C++编程中绝不是强制性的。*
tf7tbtn2

tf7tbtn22#

在C和C中,每个.cpp或.c文件都被编译为一个单独的翻译单元。在此过程中有三个相关阶段:预处理、编译和链接。
在预处理期间,#include命令被解释为复制并粘贴头文件的内容。每个预处理文件都是文本文件,并且仍然是有效的C或C
。如果您想了解更多有关过程的信息,编译器可能允许您预处理文件并观察结果文件。
然后单独编译预处理文件。从编译器的Angular 来看,函数声明最初在哪里并不重要,因为它作用于预处理的文件。您可以将预处理后的文件作为.cpp文件添加到项目中,它仍然可以编译。
因为文件是单独编译的,所以通常调用在不同转换单元中定义的函数。函数声明只是告诉编译器该函数将在程序中的某个位置找到。
在每个翻译单元编译完成后,链接器处理它们以生成最终程序。这包括找到每个函数定义,并与每个函数调用建立连接。如果未找到定义,则会出现错误。

相关问题