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

时间:2010-01-30 06:23:01

标签: c++ c

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

5 个答案:

答案 0 :(得分:5)

你需要做几件事:

  1. 将原型添加到头文件中。
  2. 使用函数定义编写新的源文件。
  3. 在一个只想使用共享函数的源文件中,在尝试调用共享函数之前,需要在某处添加#include "header.h"(将header.h替换为步骤1中的文件名)通常你把所有包含放在源文件的顶部)。
  4. 确保您的构建编译新的源文件并将其包含在链接中。
  5. 其他一些评论。将foo.h作为foo.c的标题是正常的,但这只是一种样式指南。

    使用标题时,您希望添加include guards以防止多重包含问题。

答案 1 :(得分:2)

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

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

然后你需要将文件“链接”到你的程序,它的工作方式类似于Python解释器中的“import”,但实际上在静态链接目标文件中一起工作成一个可执行文件。

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

例如,假设你有两个文件:a.c和b.c(带有a.h和b.h),在gcc上:

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

在MSVC上:

 cl a.c b.c

答案 2 :(得分:1)

有两种方法可以解决这个问题。正如其他人所说,第一步是:

创建包含函数原型的头文件。你想用

标记这个

# ifndef myheader_h

# define myheader_h

// prototypes go here...

# endif

防止多个夹杂物出现问题。

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

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

但是,如果您真的打算在多个项目中使用它,您可能希望独立编译此源文件,并从其他项目中引用该对象文件。这很像“库”,尽管库可能包含多个对象模块 - 每个对象模块都已编译但尚未链接。

<强>更新 有人指出,这实际上只能使标题不包含在单个cpp文件中。新闻快讯:这就是你需要做的一切。

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

另一方面,LINKER负责修复这些引用,如果在多个目标文件中定义了相同的符号,IT将抛出适合。要做到这一点,必须在两个单独的源文件中定义一个函数 - 一个带有正文的真实定义,而不仅仅是一个extern原型 - 或者包含其正文/定义的对象文件必须包含在link命令中不止一次。

<强>重新: “内联” 使用“内联”意味着优化功能。声明为内联的函数将其主体在每个调用它们的位置内联展开。使用它来解决多个定义错误非常非常糟糕。这类似于宏观扩张。

答案 3 :(得分:0)

见弗朗西斯的回答。您编写的句子,“或者我是否需要将函数原型放在.h文件中,并将实现放在一个单独的.cpp文件中,该文件与.h文件同名,并且#include .h无论我需要它? “,非常正确。你不必完全按照这种方式做事,但它确实有效。

答案 4 :(得分:0)

这取决于你如何做到这一点,编译器并不关心。但是如果将函数放在.h文件中,则应该声明它们为__inline,否则如果将头文件包含在多个.cpp文件中,则会有多个定义的符号。

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

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