Einzelnen Beitrag anzeigen

Benutzerbild von Dalai
Dalai
Online

Registriert seit: 9. Apr 2006
1.682 Beiträge
 
Delphi 5 Professional
 
#20

AW: PChar, PAnsiChar, PWideChar, Integer, LPARAM, ... ?

  Alt 4. Nov 2017, 22:48
Man sollte immer den für die Aufgabe passenden Typen benutzen, egal in welcher Version von Delphi oder FreePascal (bzw. jeder anderen Programmiersprache). Beispiel:
Delphi-Quellcode:
MessageBox(0, PChar(...));
MessageBoxA(0, PAnsiChar(...));
MessageBoxW(0, PWideChar(...));
Das funktioniert auf allen Delphi-Versionen, egal wie alt oder neu, wahrscheinlich auch mit FreePascal.

Warum nicht sowas wie MessageBox(0, PWideChar(...)); , von dem du ja sagst, die IDE meint, der Parameter wäre PWideChar? Nun, bei einem aktuellen Delphi macht das keinen Unterschied, weil PChar nur ein Alias für PWideChar ist (und MessageBox ein Alias für MessageBoxW), d.h. der Compiler liest den Code als MessageBoxW(0, PWideChar(...)); .

Aber sobald man denselben Code auf einem alten Delphi oder FreePascal benutzen will, kommen Warnungen wegen impliziter String-Umwandlung mit potentiellem Datenverlust. Warum? Weil MessageBox ein Alias ist, genau wie PChar. Der Compiler liest den Code daher als MessageBoxA(0, PWideChar(...)); - Type mismatch. PAnsiChar, PWideChar sowie MessageBoxA und MessageBoxW sind keine Aliase sondern konkrete Typen.

Ist eigentlich gar nicht so schwer zu verstehen. Manchmal braucht man konkrete Typen wie PAnsiChar, PWideChar, in allen anderen Fällen sollte man die Aliase (PChar, String usw) benutzen, weil der Code dann ohne Anpassungen wiederverwendbar ist. Manchmal muss man bei Code nicht nur an sich selbst denken sondern auch Code weitergeben; da ist es sehr hilfreich, wenn dieser korrekt funktioniert und keine Warnungen produziert. Warnungen zu bearbeiten, macht nämlich viel Arbeit (ich bearbeite derzeit derartigen fremden Code...).

Grüße
Dalai

Geändert von Dalai ( 4. Nov 2017 um 22:51 Uhr)
  Mit Zitat antworten Zitat