繁体   English   中英

C \\ C ++-在多个程序中重用函数

[英]C\C++ - Re-using functions across multiple programs

在Python中,只要我想在多个程序中使用一堆函数,我都会创建另一个.py文件,然后将其导入到需要的地方。 我将如何在C / C ++中做到这一点? 是否将原型和实现都转储到.h文件中? 还是我需要将函数原型放在.h文件中,并将实现放在单独的.cpp文件中,该文件与.h文件同名,并在需要的地方#include .h?

您需要做几件事:

  1. 将原型添加到头文件。
  2. 用函数定义编写一个新的源文件。
  3. 在只想使用共享功能的源文件中,您需要在尝试调用共享功能之前,在某个地方添加#include "header.h" (用步骤1中的文件名替换header.h)。您将所有包含项放在源文件的顶部)。
  4. 确保您的构建编译了新的源文件并将其包含在链接中。

其他一些评论。 foo.h作为foo.c的标头是正常的,但这只是样式准则。

使用标头时,您想添加包含保护措施以防止出现多个包含问题。

在C / C ++中,我们通常将声明放入.h文件中,并将实现放入.c / cpp文件中。

(注意:还有很多其他方法,例如include,templates,inline,extern等。因此,您可能只在头文件或c / cpp文件中找到一些代码-例如某些STL和模板)

然后,您需要将文件与程序“链接”,该程序的工作方式类似于Python解释器中的“导入”,但实际上是将对象文件静态链接到单个可执行文件中。

但是,“ link”命令和语法取决于您的编译器和OS链接器。 因此,您需要检查编译器以获取更多信息,例如UNIX上的“ ld”和DOS / Windows上的“ link.exe”。 而且,通常C编译器会自动调用链接器。

例如,假设您在gcc上有2个文件:ac和bc(带有ah和bh):

 gcc -o a.out a.c b.c

在MSVC上:

 cl a.c b.c

有两种方法可以解决此问题,但仅略有不同。 正如其他人所说,第一步是:

-创建一个包含函数原型的头文件。 您将想要用

# ifndef myheader_h

# define myheader_h

// prototypes go here...

# endif

防止包含多个杂质的问题。

-创建一个包含实际定义的.c文件。

这是解决方案分支的地方。 如果要将源直接包括在项目中,请在编译阶段和链接阶段将.c文件作为一部分。

但是,如果您真的计划在多个项目中使用它,则可能要独立编译此源文件,并从其他项目中引用目标文件。 尽管库可能包含多个对象模块-每个模块都已编译但尚未链接,但这大致上就是“库”。

更新有人指出,这实际上只能防止将标头包含在单个cpp文件中。 新闻快讯:这就是您需要做的。

编译器分别处理每个cpp文件。 每个cpp源文件包含的头文件告诉编译器,“嘿!这是在另一个源文件中定义的!假定与此原型匹配的引用是A-OK,然后继续。”

另一方面,LINKER负责修复这些引用,如果在多个目标文件中定义了相同的符号,则IT部门将予以配合。 为此,必须在两个单独的源文件中定义一个函数-一个具有主体的真实定义,而不仅仅是extern原型-否则包含该主体/定义的目标文件必须包含在link命令中不止一次。

回复:“ inline”使用“ inline”是一种优化功能。 声明为内联的函数的主体在每个被调用的地方都内联扩展。 用它来解决多个定义错误是非常非常糟糕的 这类似于宏扩展。

参见弗朗西斯的答案。 您写的一句话,“还是我需要将函数原型放置在.h文件中,并将实现放置在单独的.cpp文件中,该文件与.h文件同名,并在需要的地方#include .h? ”,这是非常正确的。 您不必完全按照这种方式做事,但是它可以工作。

这取决于您如何执行,编译器不在乎。 但是,如果将函数放在.h文件中,则应将它们声明为__inline否则,如果将头文件包含在多个.cpp文件中,则会有多个已定义符号。

另一方面,如果使它们成为__inline,则倾向于在使用该函数的每个位置创建一个副本。 这会膨胀程序的大小。 因此,除非函数很小,否则最好将函数放入.cpp并创建带有函数原型和公共结构的并行.h。 这是大多数程序员的工作方式。

另一方面,在STL(标准模板库)中,几乎所有代码都在头文件中。 (不带.h扩展名)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM