在Python中,每当我想要在多个程序中使用一堆函数时,我会创建另一个.py文件,然后只需将其导入到我需要它的地方。我如何在C / C ++中做到这一点?我是否将原型和实现转储到.h文件中?或者我是否需要将函数原型放在.h文件中,并将实现放在一个单独的.cpp文件中,该文件与.h文件的名称相同,并且#include .h我需要的地方?
答案 0 :(得分:5)
你需要做几件事:
#include "header.h"
(将header.h替换为步骤1中的文件名)通常你把所有包含放在源文件的顶部)。其他一些评论。将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扩展名)