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

所以,我有一组相互依赖的.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文件的“骨架”是什么样的(可预设,函数调用)?
  3. 什么是{$​​ LINKLIB C},cdecl和CALLBACK? 他们在我见过的其他问题/答案中很常见

也许我需要改变我的搜索/问题,但老实说我不确定如何正确地问这个问题。 我不需要一个具体的答案,说实话,如果有人可以指点我一些链接(一本书:我将来会使用这种语言),我更愿意,我真的很感激。

在此先感谢您的帮助。

从#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文件。

关于Delphi开发,About.com有一个非常详细的部分,例如, 与单元一起工作的页面可能是学习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库中的函数,因此您可以调用它们。 如果您正在寻找有关转换头文件的更多信息,B​​ob博士有一个关于在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.