なぜこのコードはコンパイラエラーになりませんか?私は、例えば "CallMe"へのあいまいな呼び出しのようなエラーが予想されます。これはコンパイラや言語のバグですか?これは、関数名の前にユニット名とドットを使用することで回避できますが、名前の衝突に対してユーザーコードとライブラリコードを保護しません。あなたのコードは何かをしたが、それは他の何かをしたと思う、それは悪いです。異なるユニットで同じシグネチャを持つ関数を呼び出すと、コンパイラエラーが発生するのはなぜですか?
uses
Unit2, Unit3;
{$R *.lfm}
{ TForm1 }
procedure TForm1.Button1Click(Sender: TObject);
begin
ShowMessage(IntToStr(CallMe(5)));
end;
unit Unit2;
{$mode objfpc}{$H+}
interface
uses
Classes, SysUtils;
function CallMe(A: Integer) : Integer;
implementation
function CallMe(A: Integer) : Integer;
begin
Result := A * 2;
end;
end.
unit Unit3;
{$mode objfpc}{$H+}
interface
uses
Classes, SysUtils;
function CallMe(A: Integer) : Integer;
implementation
function CallMe(A: Integer) : Integer;
begin
Result := A * -1;
end;
end.
これは仕様です。コンパイラが最後にコンパイルしたものをコンパイル時に呼び出します。他のものを呼びたい場合は、ユニット名の前にドットをつけて名前に付けてください。 – MartynA
ありがとうございます。私はこのデザインの背後にある動機づけを知りたいです。これはバグの機会を作ります。ユニット2のCallMeを元々使用していたプログラマBがユニット3を追加したとしましょう。彼は誤ってCallMeを何か他のものに置き換えたことを知らないので(unit of code)コンパイルして実行します。警告なしエラーなし。私はむしろ実行時の問題よりもコンパイラエラーがあり、私はAVeryLongLibraryName.FunctionNameコールを必要とせず、曖昧な呼び出しのためにすべてのインクルードユニットですべての呼び出しを調べる必要はありません。 –
プログラミング言語はバグの可能性を秘めています。すべては、あなたが何をしているのかを知る必要があります。これらのケースについてのヒントを示す外部ツールがあります。 –