wp_xyz hat geschrieben:
Woher weißt du das? Das steht nirgends. Wenn der Compiler meldet, dass die Routine "inline" deklariert ist, dann nehme ich an, dass das "inline" halt oben im Interface-Teil steht, da wo es ja auch hingehört. Aber du hast recht: Leider sind die Posts hier oft so unvollständig, so dass man ohne Kristallkugel nicht weiterkommt.
Die sind nicht wirklich unvollständig, zumindest meiner nicht. Und ich nehme an, bei Vbxler auch nicht. Er wird, wie ich, ganz einfach nirgends inline verwendet haben, wie er schreibt (Mathias machte den Vorschlag, es zu probieren). Bei mir wird, wie ich schreibe, die Meldung auch bei DebugLn, Str() und ähnlichen ausgegeben. Folgender kleiner (unsinniger) Quelltext hat bei mir die oben genannte Meldung bei Result[1] zur Folge:
Code: Alles auswählen
function Test(const AString:String):String;
begin
Result:=AString;
if Length(AString)>0
then Result[1]:='#'; // Hint: Call to subroutine "Test(const AnsiString):AnsiString;" marked as inline is not inlined
end;
Auch bei einem einfachen Aufruf von DebugLn kommt die Meldung
Code: Alles auswählen
procedure Test2(const ADebug:String);
begin
DebugLn(ADebug); // Hint: Call to subroutine "Test2(const AnsiString);" marked as inline is not inlined
end;
Diese beiden Testfälle stehen hier nur in der Implementation, im Interface tauchen sie nicht auf, was aber keinen Unterschied macht.
Die Meldung kann man ignorieren, aber es wäre schon interessant zu wissen, warum die ausgegeben wird. DebugLn ist in LCLProc wie folgt deklariert:
procedure DebugLn(const s: string = ''); inline; overload;
womit schon mal ein inline da wäre. Beim Zugriff auf Result[1] könnte auch eine interne inline-Funktion beteiligt sein. Bei Vbxler werden die Meldungen auch bei Zugriffen auf ein Array ausgegeben (jeweils die Ergebnisseite).
Nachtrag: FPC 3.1.1, Lazarus 1.9.0 - 57432M