不写两次函数头的方法?

时间:2010-05-26 13:26:36

标签: c++ c header

我有一个C / C ++问题,我可以在不编写函数标题两次的情况下在不同的目标文件或项目中重用函数吗? (一个用于定义函数,一个用于声明函数)

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

我正在寻找用C / C ++编程的方法,如http://www.digitalmars.com/d/1.0/pretod.html

所述

8 个答案:

答案 0 :(得分:11)

Imho,从源代码生成标题是一个坏主意,并且不切实际。

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

以下是一些例子:

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

您通常编写标题,然后在相应的源文件中编写实现。

我认为反过来做反直觉,不符合CC++的精神。

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

虽然我同意将方法/函数的头定义复制到源文件通常很烦人,但您可以配置代码编辑器以简化此操作。我使用Vim和一个快速脚本帮助我解决了这个很多。我猜大多数其他编辑都有类似的解决方案。

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

另外,仅举一步说,C/C++没有这样的事情:有C并且有C++;这些是不同的语言(确实分享很多,但仍然)。

答案 1 :(得分:1)

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

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

答案 2 :(得分:0)

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

为了使用这些功能,你必须做些什么:

  1. 创建一个库(DLL / so或静态库.a / .lib - 现在我推荐使用静态库以方便使用)来自实现所在的文件
  2. 在程序中使用头文件(#include it)(不需要重新编写头文件)来获取函数定义并从步骤1链接到库。 / LI>

    虽然> this<是Visual Studio的一个例子,它也适用于其他开发环境。

答案 3 :(得分:0)

这似乎是一个基本问题,所以假设我没有误读, 以下是重复使用的基本示例,以回答您的第一个问题:

#include "stdio.h"

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

说明: 1. stdio.h是一个C头文件,包含(以及其他)一个名为puts()的函数的定义。 2.在main中,puts()从包含的定义中调用。

有些编译器(包括我认为的gcc)可以选择生成标题。

答案 4 :(得分:0)

关于C ++中的标头和源文件总是有very much confusion。我提供的链接应该有助于澄清一点。

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

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

#include <vector>

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

答案 5 :(得分:0)

我认为这是一个很好的问题,导致我这样问:Visual studio: automatically update C++ cpp/header file when the other is changed?

提到了一些重构工具,但不幸的是我认为没有一个完美的解决方案;你只需要编写两次函数签名。例外情况是您在内联编写实现时,但有理由说您不能或不应该总是这样做。

答案 6 :(得分:0)

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

答案 7 :(得分:0)

您可以将所有定义放在头文件中......

这违反common practice,但不是unheard of