2010-05-26 57 views
9

我有一个C/C++的问题,我可以重复使用不同的对象文件或项目的功能,而无需两次写入函数头? (一个用于定义函数,另一个用于声明它)不写函数头两次的方法?

我对C/C++,Delphi和D了解不多。我假设在Delphi或D中,只需编写一次函数需要的参数,那么你可以在不同的项目中使用该功能。 而在C中,你需要在头文件*中的函数声明再次??,对吧?有没有一个好的工具可以从C源创建头文件?我有一个,但它不是预处理器意识,不是很严格。我有一些宏观技术,工作相当糟糕。

我找这里所描述的方式在C/C++编程像http://www.digitalmars.com/d/1.0/pretod.html

+1

我不知道D是如何在这个领域工作的,但是在Delphi中如果你正在编写一个包含将被其他单元和程序调用的例程的单元,那么你必须编写过程和函数声明两次,一次接口部分,然后再次在实现部分中的实际例程。 Delphi IDE提供了一些帮助,但最终取决于程序员确保它们保持同步。当编译器不同步时,它肯定会通知您。要保持这一点并不难,这是程序员知道代码在做什么的一部分工作。 – Todd 2010-05-26 14:11:33

+0

'D'比C++更接近Java或C#。 – egrunin 2010-05-26 14:22:56

回答

11

恕我直言,从源头产生的头是一个坏主意,是不现实的。

标题可以包含更多信息,只是函数名称和参数。

下面是一些例子:

  • 一个C++报头可以定义一个抽象类其中源文件可以是不需要的
  • 模板可以只在头文件
  • 默认被定义参数仅在类定义中指定(因此在头文件中)

您通常会为您写信r头,然后将实现写入相应的源文件中。

我认为做另一种方式是违反直觉,不符合CC++的精神。

唯一的例外是可以看到的是静态功能。一个静态函数只出现在其源文件(.c.cpp)中,并且不能(显然)在其他地方使用。

尽管我同意将方法/函数的头文件定义复制到源文件通常很烦人,但您也可以配置代码编辑器来缓解这种情况。我使用Vim和一个快速脚本帮助我处理了这个很多。我想大多数其他编辑器都有类似的解决方案。

无论如何,虽然这看起来很烦人,但请记住它也提供了更大的灵活性。您可以分发头文件(.h,.hpp或其他),然后透明地更改源文件中的实现。

此外,刚刚提到它,有没有这样的事情C/C++:有C且有C++;那些是不同的语言(这确实分享很多,但仍然)。

+2

关于头文件中额外信息的好处 - 可能想提及成员函数的默认参数,只能在头文件中指定,而大多数模板代码只能存在头文件中。 – AshleysBrain 2010-05-26 14:15:15

+0

@AshleysBrain:的确很好的例子。将它们添加到我的答案中。谢谢 ! – ereOn 2010-05-26 14:33:07

0

考虑到你已经声明了一些函数并编写了它们的实现,你将有一个.c/cpp文件和一个头文件.h文件。

你必须要使用这些功能做什么:

  1. 创建库(DLL/SO或静态库.A/.LIB - 现在我推荐使用的方便性的静态库)从这些文件是执行驻留程序
  2. 在程序中使用头文件(#include it)(不需要重写头文件)以获取函数定义并与步骤1中的库链接。

虽然>this <是Visual Studio的一个示例,它对于其他开发环境也非常合适。

+3

其实你不必创建一个库。你也可以链接到目标文件(为了完整性)。 – 2010-05-26 13:45:20

+0

@ Space_C0wb0y True – INS 2010-05-26 14:53:11

0

这似乎是一个基本的问题,所以假设我没有误读, 这里是再利用的一个基本的例子,来回答你的第一个问题:

#include "stdio.h" 

int main(int c, char ** argv){ 
    puts("Hello world"); 
} 

说明: 1.标准输入输出.h是一个C头文件,其中包含一个名为puts()的函数的定义。 2.在main中,puts()被调用,从包含的定义中被调用。

一些编译器(包括gcc我认为)有一个选项来生成标题。

0

总是有关于C++中的标题和源文件的verymuchconfusion。我提供的链接应该有助于澄清这一点。

如果您处于想要从源文件中提取标题的情况,那么您可能会以错误的方式进行操作。通常你首先在头文件中声明你的函数,然后在源文件中为它提供一个实现(定义)。如果你的函数实际上是一个类的方法,你也可以在头文件中提供定义。

从技术上讲,一个头文件仅仅是一个,实际上是由预处理器插入到源文件中的文本的一堆:

#include <vector> 

告诉预处理器在准确的位置插入的文件向量的内容,其中出现#include。这真的只是文字替换。所以,头文件不是某种特殊的语言结构。它们包含正常的代码。但通过将该代码放入单独的文件中,您可以使用预处理器轻松地将其包含在其他文件中。

+0

+1可能是最好的答案 – nico 2010-05-27 00:13:32

+0

-1这是对头文件/源文件如何工作的解释,而不是对问题的回答。 – 2010-05-27 07:06:52

+0

在我看来,这个问题的提出方式表明OP不理解标题的工作方式。如果他这样做了,他自己就可以回答他的问题。任何解决他的问题的答案,但并不能帮助他首先理解它,但实际上并没有什么帮助。我想我已经提供了让他自己解决问题所需的所有信息。 – 2010-05-27 07:10:57

1

在我看来,你并不真的需要/想从源自动生成标题;您希望能够编写单个文件并拥有一个可以智能地将其分割为头文件和源文件的工具。

不幸的是,我不知道有任何这样的工具。当然可以编写一个 - 但你需要一个给定的C++前端。你可以尝试使用clang写一些东西 - 但这将是一项重要的工作。

0

你可能感兴趣Lazy C++。但是,在尝试使用此工具之前,您应该采用老式方式(使用单独的标题和源文件)来完成一些项目。我考虑过自己使用它,但后来认为我会不小心编辑生成的文件而不是lzz文件。