Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/cmake/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Delphi System.Assign的确切签名是什么(用于程序表达式)?_Delphi - Fatal编程技术网

Delphi System.Assign的确切签名是什么(用于程序表达式)?

Delphi System.Assign的确切签名是什么(用于程序表达式)?,delphi,Delphi,不幸的是,RTL源代码中没有精确的Assign签名,我的猜测尝试如下: const Assign: procedure (var F; const FileName: string) = System.Assign; { or } Assign: function (var F; const FileName: string): Integer = System.Assign; { also I tried "internal" one from _AssignFile } 未

不幸的是,RTL源代码中没有精确的
Assign
签名,我的猜测尝试如下:

const
  Assign: procedure (var F; const FileName: string) = System.Assign;
  { or }
  Assign: function (var F; const FileName: string): Integer = System.Assign;
  { also I tried "internal" one from _AssignFile }
未产生任何积极结果,编译器拒绝将此contant表达式视为过程表达式,并抱怨正确的值(
E2029'('expected but';'found')


那么,我应该使用哪种类型来精确匹配Delphi RTL?

如果要打开System.pas文件并读取它,在XE2中,您有以下内部过程:

function _AssignFile(var t: TFileRec; const s: PChar): Integer;
function _AssignText(var t: TTextRec; const s: PChar; const CP: word): Integer;
我不认为有任何全局稳定过程的名称中没有下划线-列出的是Delphi编译器内部,如不可见过程,当您声明string或dynarray变量时,这些过程会被隐式调用

像很多过程一样,比如
\u Write0LString
,它们实现了通常的WriteLn调用

因此,您必须创建一个包装器函数,该函数将调用
AssignFile
,并将对包装器的引用放入变量中

然而,您并没有在Delphi版本中添加标记,不同的vesions可能会有不同的内部函数声明。因此,请查看您的特定Delphi的来源


还有,你为什么需要它?我记得我在TurboPascal 5.5中做了这样一件事,使基于字符串的文件-make
WriteLn
表现得像C
sprintf
。但是,在现代Delphi中,当您可以使用
TStream
时,为什么需要它呢?

系统。分配是一个函数。它的前景是完全没有希望的。它说:

function Assign(var F: File; FileName: String; [CodePage: Word]): Integer; overload;
function Assign(var F: File; FileName: String; [CodePage: Word]): Integer; overload;
function Assign(var F: File; FileName: String; [CodePage: Word]): Integer; overload;
我只能猜测为什么文档生成器不能处理这个函数。但这三个相同的重载显然是假的。这不是一个函数,而是一个过程

没关系。因为它是内在的,所以不能将其分配给函数指针。解决方案是将其封装在自己的函数中

procedure MyAssign(var F: File; const FileName: string);
begin
  Result := System.Assign(F, FileName);
end;
然后可以将该函数指定给程序类型的变量或常量

const
  AssignProc: procedure(var F: File; const FileName: string) = MyAssign;
Assign
的另一个变量采用第三个参数,该参数指定代码页,作为
字传递。只有当
Assign
的第一个参数是
TextFile
时,才能调用该函数

所以,内在论本身就是一条法则


请注意,文档中确实说明不应再使用
Assign
。相反,您应该使用
AssignFile
。注意,那里没有更好的了

Assign
是Delphi的一种语言残余,它将其起源追溯到最初的Turbo Pascal语法。早在函数重载被添加到语言语法之前,早在RTL的文本文件和“文件类型”内部数据结构被记录之前,就有了
Assign

Assign
是一个非常简单的使用过程,但是当你看看它必须做什么时,你会发现如果没有某种编译器魔法,它几乎不可能实现<代码>TFoo文件
创建了一种与整数文件
不同且不兼容的文件类型。然而,这两个参数都可以作为第一个参数传递给
Assign

今天,您可能可以使用文件参数的泛型类型param来实现
Assign
。泛型类型将符合传入的变量的类型。这很好,但在将泛型添加到混合中之前25年,我们需要一种将类型化文件变量与字符串文件名关联的方法

Assign
是编译器的固有函数。这意味着它位于Delphi/Pascal语法空间之外
Assign
本质上是一个符合类型的过程,它不能用强类型的Delphi/Pascal语言来表示(没有诸如泛型类型之类的现代和复杂的语言扩展)。它不是无类型的,也不是动态类型的,因为实际的参数类型是在编译时完全确定的

您不能获取
Assign
函数的地址。即使可以,因为它是无定形的,您也无法定义一个过程类型来准确地表示它所有可能的调用签名


编译器魔法函数存在于语言之外,用于处理无法用当时可用的语法轻松表示的任务<代码>分配就是一个例子
Writeln
()是另一种

签名见文件:@ain超载?内在的?Emba的维基在比这简单得多的情况下遭到破坏。Jsut通过你的链接阅读这三个(!)声明…不。我很久以前就把它弄丢了。它的主要价值是逆向工程数据类型,如现在正式发布的
文件
文本
,这些数据类型(这些年以来发生了显著变化)文档非常容易误导,我尝试了3个编译器版本,但都不允许调用
赋值
作为
函数
@user539484是的,这里的文档太差了。@DavidHeffernan似乎他们刚刚销毁了文档,虽然我能理解一些随机转换器错误可能导致这种情况,我不明白为什么他们不能恢复MediaWiki历史!例如:(在XE3文档中相同)-属性在HTML源代码中,但它们是故意的hidden@DavidHeffernan虽然我们都同意包装函数,但我想我们都会同意,这将是一项令人不快的工作。这让我想知道,_AssignFile和_AssignText不是内部函数,但您仍然不能使用它们来分配过程变量,至少在XE2控制台应用程序中不能。为什么?@Arioch“围绕系统单元的特殊编译器魔法似乎将该符号抑制为Pascal代码。我认为您仍然可以使用asm来实现它。但是_AssignFile和_AssignText不是内部函数,它们是系统单元中的全局例程,但您仍然不能使用它们来分配过程变量,至少在XE2控制台应用程序中不能。为什么?我好像记得艾尔