3

所以,我有一组相互依赖的 .c 和 .h 文件,我试图弄清楚 C/C++ 到 Pascal 的工作原理(否则我的 delphi/pascal 工作非常基本)。c文件是数学算法的步骤1-N(按顺序)(每个都是一个单独的函数),一个标题指定每个函数中使用的变量(我用来record在delphi中重新创建.h文件),和另一个标题详细说明了自定义变量类型。目标是无需将 C 代码重写为 Pascal/Delphi 语法即可访问这些函数,从 delphi 代码链接到一些现有的 c。有太多冗长的文件(12 .c 和 4 .h)我无法剪断,而且我的 C 非常生锈,但我会尝试。

例如,我有一个文件funcs.h

#ifndef _FUNCS_H
#ifndef _FUNCS_H

#ifdef __cplusplus
extern "C" {
#endif

#include "New_Type.h"  // custom variable used in funcs.h
#include "Optional.h"  // optional set of more functions

typedef struct {
    int a1[4];
    double b1[10];

    // Computed if optional functions are requested
    double c1[10];
    int d1[4];
} func1;

typedef struct {
    new_type c2, d2;
} func2;
}
#endif
#endif

和文件func1.cfunc2.c对上述变量进行一些数学运算(主要是线性代数)。我的直接问题是:

  1. 我是否需要多个 delphi 文件,就像有多个 C 头文件一样?
  2. delphi 文件的“骨架”是什么样的(premable,函数调用)?
  3. {$LINKLIB C}、cdecl 和 CALLBACK 是什么?他们在我见过的其他问题/答案中很常见

也许我需要改变我的搜索/问题,但老实说,我不确定如何正确地问这个问题。我不需要一个具体的答案,老实说,如果有人能指出我的一些链接(见鬼一本书:我将来会使用这种语言),我会非常感激。

提前感谢所有帮助。

4

1 回答 1

3

从 #2 开始:在 Delphi 中,头文件和实现都放在同一个文件中。所以这是一个类的基本骨架,显示了你的头文件(.h)和实现的东西(.c)将适合Delphi中的单元/文件的结构。

unit Unit1;

interface
  uses // List of header dependencies goes here...
  // Stuff from the .h file will go here
implementation
  uses // List of implementation dependencies goes here...
  // Stuff from the .c file will go here
end.

回到 #1: C 头文件到 Delphi 文件的 1:1 映射并不是绝对必要的,但如果这是 C 中每个文件的良好粒度级别,那么在 Delphi 中可能会以类似的方式工作。除非您有充分的理由更改它,否则我会将它们从一个 C 头文件映射到一个 Delphi 文件。

About.com 有一个关于 Delphi 开发的非常详细的部分,例如,关于使用单元的页面可能是学习 Delphi 文件结构的一个很好的起点。我还发现自己经常使用DelphiBasics作为参考站点(尽管它更多地针对方法而不是结构)。并且绝对不要打折 Embarcadero 网站上的官方文档。他们的语言指南部分实际上是一本关于学习 Delphi 的教科书,并且足够详细,可以了解该语言的基础知识。

然后就#3:如果您想要更深入,这很容易成为关于堆栈溢出的几个单独的完整问题。但总的来说,听起来您正在查看直接从 Delphi 调用 c 代码的代码。CDecl是调用约定之一(恰好匹配 c...),它指定将哪些顺序参数传递给方法。在 Embarcadero 的文档中了解更多信息。$LINKLIB用于链接到库(在本例中为 C 库,如果您正在调用 c 代码,您会这样做),回调大致相当于 c 中的函数指针。

从第三个子问题的整体声音来看,我猜您一直在阅读如何在 Delphi 项目中使用 C 代码,而无需将 C 代码重写为 Pascal/Delphi 语法,从 delphi 链接您不想重写或转换的某些现有 c 库的代码。如果这是您的最终目标,只是链接到您的 C 库而不重写它,那么这篇关于在 FreePascal 中使用 C 的文章可能会有所帮助。为了链接到 C 代码,FreePascal 和 Delphi(Pascal 的两种变体)之间的差异相对可以忽略不计)。基本上,您必须重写或将 c 标头转换为 Pascal 语法,以便 Delphi 知道您的 C 库中有哪些函数,以便您可以调用它们。Bob博士有一个很好的详细页面如果您正在寻找有关转换头文件的更多信息,有关在 Delphi 中使用 C dll 的信息。在有关类型名称如何匹配的其他有用信息中,该页面上有一个用于将 c 头文件转换为 delphi 头文件的自动化工具的示例。如果您的目标只是从 Delphi 应用程序调用或利用现有的 c 代码而不将整个代码库完全移植到 Delphi,则使用自动化工具将您的标头转换为 delphi 语法可能更容易。

举例来说,你的问题的标题,通过 Bob 博士的 HeadConverter 工具转换,给出如下输出:(实际输出更长,包括将你的 c 代码加载为 dll 的代码和一些注释)

unit FILE1;

interface
uses
  Windows;

{$INCLUDE "New_Type.h"}
{$INCLUDE "Optional.h"}

type
  func1 = record
    a1: Array[0..4-1] of Integer;
    b1: Array[0..10-1] of Double;
    c1: Array[0..10-1] of Double;
    d1: Array[0..4-1] of Integer;
  end {func1};

type
  func2 = record
    c2, d2: NEW_TYPE;
  end {func2};

{...}

implementation
   {...}
end.
于 2013-05-29T05:29:29.107 回答