- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
在我看来,从实际的角度来看,静态类方法和常规例程指针是兼容的,但编译器不知道这一点。示例:
type
TFunc = function(i: Integer): string;
TMyClass = class
public
class function StaticMethod(i: Integer): string; static;
end;
class function TMyClass.StaticMethod(i: Integer): string;
begin
Result := '>' + IntToStr(i) + '<';
end;
function GlobalFunc(i: Integer): string;
begin
Result := '{' + IntToStr(i) + '}';
end;
procedure CallIt(func: TFunc);
begin
Writeln(func(42));
end;
begin
CallIt(TMyClass.StaticMethod); // 1a: doesn't compile
CallIt(GlobalFunc); // 1b: compiles
CallIt(@TMyClass.StaticMethod); // 2a: compiles iff $TYPEDADDRESS OFF
CallIt(@GlobalFunc); // 2b: compiles iff $TYPEDADDRESS OFF
CallIt(Addr(TMyClass.StaticMethod)); // 3a: compiles
CallIt(Addr(GlobalFunc)); // 3b: compiles
Readln;
end.
正如评论中所指出的,3a 和 3b 都可以编译(其中编译包括在这个简单示例中在运行时工作)。当且仅当 $TYPEDADDRESS
为 OFF
时,2a 和 2b 才会编译。但 1a/1b 是不同的:1b 总是编译,而 1a 从不编译。这是设计上的区别吗?使用 3a 保存还是我忽略了任何陷阱?
最佳答案
具有相同参数和结果类型的静态类函数和普通函数在二进制级别上没有区别 - 它们是二进制兼容的,所以你的例子没问题。当然,对于编译器来说它们是不同的类型,因此您需要 Addr()
或 @
来编译您的示例。
Addr()
等同于 @
运算符,只不过它不受 $T 编译器指令的影响。如果您在示例上切换类型检查,则不会编译:
{$T+}
begin
CallIt(@TMyClass.StaticMethod);
Readln;
end.
[Pascal 错误] Project10.dpr(28): E2010 不兼容类型:“TFunc”和“指针”
关于delphi - 静态类方法和常规例程指针的兼容性如何?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6940171/
我最近购买了《C 编程语言》并尝试了 Ex 1-8这是代码 #include #include #include /* * */ int main() { int nl,nt,nb;
早上好!我有一个变量“var”,可能为 0。我检查该变量是否为空,如果不是,我将该变量保存在 php session 中,然后调用另一个页面。在这个新页面中,我检查我创建的 session 是否为空,
我正在努力完成 Learn Python the Hard Way ex.25,但我无法理解某些事情。这是脚本: def break_words(stuff): """this functio
我是一名优秀的程序员,十分优秀!