Delphi XE3:使用多个C头文件和源文件

时间:2013-05-28 22:02:22

标签: c delphi header initialization

所以,我有一组相互依赖的.c和.h文件,而我正在试图弄清楚C / C ++到Pascal的确切工作方式(我的delphi / pascal工作非常基本)。 c文件是数学算法的步骤1-N(按顺序)(每个是一个单独的函数),一个头指定每个函数中使用的变量(我使用record来重新创建.h文件在delphi中),另一个标题详细说明了自定义变量类型。目标是访问函数而不必将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.c func2.c 对上述变量进行一些数学处理(主要是线性代数)。我的直接问题是:

  1. 我是否需要多个delphi文件,就像有多个C头文件一样?
  2. delphi文件的“骨架”是什么样的(可设置,函数调用)?
  3. 什么是{$​​ LINKLIB C},cdecl和CALLBACK?他们在我见过的其他问题/答案中很常见
  4. 也许我需要改变我的搜索/问题,但老实说我不确定如何正确地问这个问题。我不需要特定的答案,老实说,如果有人能指出我的某些链接(我会在将来使用这种语言),我更愿意,我真的很感激。

    提前感谢所有帮助。

1 个答案:

答案 0 :(得分: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头文件的1:1映射到Delphi文件并不是绝对必要的,但如果在C中每个文件的粒度级别很好,那么可能会在Delphi中以类似的方式解决。除非你有充分的理由改变它,否则我会把它们映射到一个C头文件到一个Delphi文件。

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

然后就#3而言:如果您想要更深入,这可能很容易就堆栈溢出问题提出几个单独的完整问题。但总的来说,听起来你正在寻找直接从Delphi调用c代码的代码。 CDecl是调用约定之一(碰巧与c匹配的约定),它指定将哪些订单参数传递给方法。阅读更多相关信息in Embarcadero's documentation$LINKLIB用于链接到库(在本例中为C库,如果您正在调用c代码,则会执行此操作),并且回调大致相当于c中的函数指针。

从第三个子问题的整体声音来看,我猜你一直在阅读如何在Delphi项目中使用C代码,而不必将C代码重写为Pascal / Delphi语法,从delphi代码链接到一些你不想重写或转换的现有c库。如果这是您的最终目标,只需链接到您的C库而不重写它,using C in FreePascal上的这篇文章可能会有很好的帮助。为了链接到C代码,FreePascal和Delphi(两种Pascal变体)之间的差异相对可以忽略不计。基本上,您必须重新编写或将c标头转换为Pascal语法,以便Delphi知道C库中的函数,因此您可以调用它们。如果您正在寻找有关转换头文件的更多信息,B​​ob博士对于在Delphi中使用C dll有一个很好的detailed page。在有关类型名称如何匹配的其他有用信息中,在该页面上有一个示例,用于将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.
相关问题