如何将“nil”常量传递给无类型参数?

8
有没有可能将未声明的常量作为某个函数的无类型参数传递给nil? 我有一些类似这样的函数,并且我想通过将一些常量传递给参数来满足编译器的要求。在内部,我根据参数进行决策。我知道我可以使用指针来代替无类型参数,但对于我的情况来说,这更加方便。 现在我得到了“E2250没有重载版本的'RS232_SendCommand'可以用这些参数调用”的错误提示。
function RS232_SendCommand(const Command: Integer): Boolean; overload;
begin
  // is it possible to pass here an undeclared constant like nil in this example?
  Result := RS232_SendCommand(Command, nil, 0);
end;

function RS232_SendCommand(const Command: Integer; const Data; const Size: Integer): Boolean; overload;
begin
  ...
end;

这段代码是可行的,但如果我不需要声明变量会更好。
function RS232_SendCommand(const Command: Integer): Boolean; overload;
var
  Nothing: Pointer;
begin
  Result := RS232_SendCommand(Command, Nothing, 0);
end;

解决方案是使用类似以下内容的东西。
function RS232_SendCommand(const Command: Integer): Boolean; overload;
begin
  // as the best way looks for me from the accepted answer to use this
  Result := RS232_SendCommand(Command, nil^, 0);

  // or it also possible to pass an empty string constant to the untyped parameter
  // without declaring any variable
  Result := RS232_SendCommand(Command, '', 0);
end;

我这样做是因为我有些命令在发送后还会附带数据。

感谢帮助。

2个回答

13

简单:

RS232_SendCommand(Command, nil^, 0);

你只需要确保在RS232_SendCommand内部不要访问Data参数,但我猜这就是0大小参数的作用。

在我看来,这是最好的解决方案,因为它非常明确地说明了你正在传递一个不能被访问的东西。


哇,这真是太聪明了。至少我会接受这个答案,因为之前有人说这是不可能的。谢谢。 - TLama
1
我不确定nil^可以被归类为优雅的代码!;-) 你只需记住,这不会对 nil 指针进行反引用。 - David Heffernan

2

不行。 据我所知不行。

未指定类型的参数

在声明 varconstout 参数时,您可以省略类型说明。(值参数必须有类型。)例如:

procedure TakeAnything(const C);

声明了一个名为 TakeAnything 的过程,它接受任何类型的参数。当您调用这样的例程时,不能将数字或未指定类型的数字常量传递给它。

来自:参数(Delphi)

因此,也许应该添加另一个重载版本,没有 const 参数,当 Size = 0 时可以调用它。


4
谢谢。这对我很有帮助。从句子“你不能传递数字或未定义类型的数值常量”中,我找到了一种方法,一个空字符串常量:“Result := RS232_SendCommand(Command, '', 0);”。 - TLama

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接