2015-01-30 13 views
8

Tại sao mã này:Str trong XE7 tạo ra cảnh báo lạ

w: word; 
    s: String; 
begin 
    str(w, s); 

tạo ra cảnh báo này trong XE7:

[dcc32 Warning] Unit1.pas(76): W1057 Implicit string cast from 'ShortString' to 'string' 

Tom

+0

Một trong nhiều cảnh báo trình biên dịch tôi đã được giao dịch với từ nâng cấp từ XE2 để XE7. –

+0

Trình biên dịch thực sự tạo ra một cuộc gọi đến _StrLong trả về một chuỗi ngắn. Đây không phải là câu trả lời tất nhiên. –

+0

@Jerry - Điều này cũng tương tự đối với XE2. –

Trả lời

5

System.Str là một chức năng nội tại mà ngày từ một kỷ nguyên byegone . Các documentation nói điều này:

thủ tục Str (const X [: Width [: Decimals]]; var S: String);

....

Ghi chú: Tuy nhiên, về việc sử dụng thủ tục này, trình biên dịch có thể ban hành một cảnh báo: W1057 Implicit chuỗi cast từ '% s' thành '% s' (Delphi).

Nếu một chuỗi có độ dài tối thiểu được xác định trước là không cần thiết, hãy thử sử dụng hàm IntToStr thay thế.

Vì đây là nội tại, có thể có điều gì đó đang diễn ra. Đằng sau hậu trường, chức năng nội tại được thực hiện bằng một cuộc gọi đến một chức năng hỗ trợ RTL mang lại một số ShortString. Trình biên dịch ma thuật sau đó biến nó thành một string. Và cảnh báo bạn về chuyển đổi tiềm ẩn. Trình biên dịch ma thuật biến đổi

Str(w, s); 

vào

s := _Str0Long(w); 

đâu _Str0Long là:

function _Str0Long(val: Longint): _ShortStr; 
begin 
    Result := _StrLong(val, 0); 
end; 

Kể từ _Str0Long lợi nhuận một ShortString sau đó trình biên dịch có để tạo ra mã để thực hiện các converstion ngầm từ ShortString để string khi nó gán cho biến của bạn s. Và tất nhiên nó là tự nhiên mà bạn thấy W1057.

Điểm mấu chốt là Str chỉ tồn tại để duy trì khả năng tương thích với mã Pascal ShortString cũ. Mã mới không được gọi Str. Bạn nên làm những gì tài liệu nói và gọi IntToStr:

s := IntToStr(w); 

Hoặc có lẽ:

s := w.ToString; 
+0

Chỉ định Hệ thống.Str to ShortString là một cách để chuyển đổi một số nguyên thành văn bản mà không cần phải phân bổ bộ nhớ heap. –

+0

@LURD Đúng dat. Tôi muốn nói rằng có những cách tốt hơn. Trong mọi trường hợp, ở đây chúng ta gán cho 'string'. Nhưng đối với những trường hợp cạnh mà perf là ​​quan trọng thì một trường hợp có thể được thực hiện để tránh heap với 'Str'. –

+0

David: bạn đã cho tôi thấy sự kiềm chế tuyệt vời bằng cách không bao gồm "RTFM" trong bài đăng của bạn. Cảm ơn câu trả lời thông thường của bạn. Vì chúng tôi đang di chuyển hơn một triệu dòng mã, tôi sẽ sử dụng tuyến đường "thay đổi ít nhất có thể" trên giai đoạn đầu tiên này bằng cách sử dụng $ WARNINGS OFF trên một vài dòng mã gọi ra điều này. (Chúng thực sự là Str (w: 3: 1, S), do đó, có nhiều hơn một chút so với ví dụ đơn giản mà tôi đã cung cấp ... – Tom

Các vấn đề liên quan