2012-01-12 15 views
0

考慮下面的代碼片段:爲什麼以下字符指針類型被視爲不兼容?

procedure TForm1.FormCreate(Sender: TObject); 
    {$REGION 'Sealed declarations'} 
    type WCh = WideChar; // (1) 
    type Str = ^WCh;  // (2) 
    { this routine accepts character pointer } 
    procedure Baz(Param: Str); 
    begin 
    end; 
    {$ENDREGION} 
    { this one too, but character pointer type used directly } 
    procedure Bar(Param: PWideChar); 
    begin 
    end; 
    { this constant should be compatible with strings and character pointers } 
    const FOO = 'FOO'; 
begin 
    Bar(FOO); // compiles! 
    Baz(FOO); // BAH! E2010 Incompatible types: 'Str' and 'string' 
end; 

如何解決這個問題,在使用(我希望沒有重型鑄字)保留在聲明結構化分型和清晰度和可讀性?

注:通過「密封聲明」,我真的認爲它。除非絕對必要,否則我寧願不修改它。

stringPChar之間轉換的內部處理因版本而異,所以環境可能很重要 - 我在Delphi XE中遇到了這個問題。

+0

很難理解你爲什麼不直接使用WideChar和PWideChar – 2012-01-12 07:24:43

+3

你可以簡單地通過參考文檔來回答你自己的問題:http://docwiki.embarcadero。com/RADStudio/en/Type_Compatibility_and_Identity – 2012-01-12 07:32:46

回答

4

正如羅布·肯尼迪在評論中發現正確的,問題是關於從字符串轉換字面,不串

爲簡化編碼,Delphi允許從字符串文字到PChar類型和PChar別名的隱式轉換。

爲了避免類型轉換,你可以使用

type Str = PWideChar; 

或使用DISTICT型

type Str = type PWideChar; 

我還沒有發現在字符串中的任何差異文字 - > PWideChar以Unicode版本的Delphi(2009隱式轉換和以上)。

+0

您能否擴展規則違規?字符串常量與** **字符串和PChar兼容,在內部它不是一個真正的長字符串,而是一個字符數組[0..X] Char – OnTheFly 2012-01-12 07:20:55

+0

作爲一個例子,嘗試將真常數轉換爲類型常量當Bar也會產生編譯錯誤。更可能的是,* Delphi允許從PChar到字符串*的隱式轉換,反之亦然。 – OnTheFly 2012-01-12 07:29:16

+0

@user只是閱讀我在我的評論中鏈接到的文檔Q,所有解釋有 – 2012-01-12 07:41:36

1

WCh = WideChar定義WideChar創建一個類型別名 - 他們有型身份 - 但後續Str = ^WCh定義不PWideChar創建一個類型別名。當$T+有效時,它們兼容且分配兼容,但在這種情況下這些功能不夠好。他們仍然是不同的類型。

FOO常數是字符串字面值documentation for assignment compatibility表示可以將字符串文字分配給哪些類型:「PAnsiChar,PWideChar,PChar或任何字符串類型」。 Str不是字符串類型。這是一個指針類型,但它不是PWideChar,儘管它們的定義有多相似。

字符串文字的類型根據上下文進行調整。當編譯器需要PWideChar時,字符串文字是PWideChar。當編譯器需要AnsiString時,它是AnsiString。 (如果編譯器需要這兩種類型,那麼文字將以兩種方式存儲在程序中。)字符串文字不能分配給您的Str類型,因此,根據錯誤消息,編譯器顯然選擇string作爲在這種情況下的字符串文字。您可以將其類型轉換爲其他內置類型之一,但更好的解決方案是避免使用自定義字符指針類。

+0

事實上,'T +'是我嘗試的第一件事,沒有任何成功,tho。是的,我終於決定打破封印併爲內在類型添加一些重複,以節省使用字符串常量和常量的能力。 – OnTheFly 2012-01-12 16:59:28