首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >C\C++ -跨多个程序重用函数

C\C++ -跨多个程序重用函数
EN

Stack Overflow用户
提问于 2010-01-30 14:23:01
回答 5查看 1.7K关注 0票数 1

在Python语言中,每当我有一堆函数要跨多个程序使用时,我都会创建另一个.py文件,然后在需要的地方导入它。我如何在C/C++中做到这一点呢?我要将原型和实现都转储到.h文件中吗?或者,我是否需要将函数原型放在.h文件中,将实现放在一个单独的.cpp文件中,与.h文件同名,并在需要的地方包含.h?

EN

回答 5

Stack Overflow用户

发布于 2010-01-30 14:26:31

你需要做几件事:

  1. 将原型添加到头文件。
  2. 使用函数
  3. 编写新的源文件,如果源文件只想使用共享函数,则需要在尝试调用共享函数(通常将#include "header.h"放在源文件的顶部)之前添加#include "header.h"(将header.h替换为步骤1中的文件名)。
  4. 确保生成编译新的源文件并将其包含在链接中。

还有一些其他的评论。将foo.h作为foo.c的标头是很正常的,但这只是一种风格准则。

在使用标头时,您需要添加include guards以防止出现多个包含问题。

票数 5
EN

Stack Overflow用户

发布于 2010-01-30 14:25:30

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

(注意:还有许多其他方法,例如include、template、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上:

代码语言:javascript
复制
 gcc -o a.out a.c b.c

在MSVC上:

代码语言:javascript
复制
 cl a.c b.c
票数 2
EN

Stack Overflow用户

发布于 2010-01-30 14:32:56

有两种方法可以做到这一点,只是略有不同。正如其他人所说,第一步是:

-Create一个包含你的函数原型的头文件。您需要用以下命令标记此标记

# ifndef myheader_h

# define myheader_h

// prototypes go here...

# endif

以防止出现多个包含的问题。

-Create包含实际定义的.c文件。

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

然而,如果你真的打算在多个项目中使用它,你可能需要独立编译这个源文件,然后引用其他项目中的目标文件。这是一个松散的“库”,尽管库可能由多个对象模块组成-每个对象模块都已编译但尚未链接。

cpp update有人指出,这实际上只是防止了头部被包含在单个文件中。新闻快讯:这就是你所需要做的。

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

另一方面,链接器负责修复这些引用,如果在多个对象文件中定义了相同的符号,则链接器将抛出异常。要实现这一点,必须在两个单独的源文件中定义函数-具有主体的实际定义,而不仅仅是外部原型-或者包含其主体/定义的目标文件必须多次包含在link命令中。

Re: "inline“对”inline“的使用是一种优化功能。声明为内联的函数在它们被调用的每个地方都会以内联方式扩展它们的主体。使用它来绕过多个定义错误是非常非常糟糕的。这类似于宏扩展。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2167063

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档